lambda/examples/test_cbv.λ
2024-04-09 13:40:20 +03:00

55 lines
1.6 KiB
Plaintext

# Y combinator
:Y \g $g ($x $x) |x \x $g ($x $x)
# True and false
:T \T \F $T
:F \T \F $F
# Logical operators (Id, Not, And, Or, Xor)
:= \c $c &T &F
:~ \c $c &F &T
:& \c \d $c $d &F
:| \c \d $c &T $d
:^ \c \d $c &= &~ $d
# List operators (Cons, Car, Cdr, Drop, Map, Scan, Filter, ZipWith)
:con \a \b \o $o $a $b
:car \l $l \a \_ $a
:cdr \l $l \_ \d $d
:drp \n \l = 0 $n $l ($l \_ \d &drp (- 1 $n) $d)
:map \f \l $l \a \d &con ($f $a) (&map $f $d)
:scn \f \x \l $l \a \d &con $x (&scn $f ($f $x $a) $d)
:flt \c \l $l \a \d $c $a (&con $a (&flt $c $d)) (&flt $c $d)
:zpw \f \l \m $l \a \b $m \c \d &con ($f $a $c) (&zpw $f $b $d)
# Non-lazy list constructor
:Nil ...
:Con ^a ^b \o $o $a $b
# Evaluate the first n elements of a list
:Evl \n \l = 0 $n &Nil ($l \a \d &Con $a (&Evl (- 1 $n) $d))
# Three different implementations of the Fibonacci sequence
:fib \a \b &con $a (&fib $b (+ $a $b))
cal &Evl 1024 $ | &fib 0 1
:fib \a \b &Y \l &con $a (&scn + $b $l)
cal &Evl 1024 $ | &fib 0 1
:fib \a \b &Y \l &con $a (&con $b (&zpw + $l (&cdr $l)))
cal &Evl 1024 $ | &fib 0 1
# 2D space vector operations (Non-lazy construct, Add, Multiply)
:Vec ^x ^y \o $o $x $y
:add \u \v $u \a \b $v \c \d &Vec (+ $a $c) (+ $b $d)
:mul \u \v $u \a \b $v \c \d &Vec (- (* $b $d) (* $a $c)) (+ (* $a $d) (* $b $c))
# Regular paper folding sequence
:lft &Vec 0 (- 1 0)
:rgt &Vec 0 (+ 1 0)
:ins \r &con &lft ($r \a \p &con $a (&con &rgt ($p \b \q &con $b (&ins $q))))
:rpf &ins &rpf
# Generate first 1024 points on the dragon curve from the regular paper folding sequence
:dir &scn &mul (&Vec 1 0) &rpf
:pos &scn &add (&Vec 0 0) &dir
cal &Evl 1024 &pos