Picolisp two examples
This commit is contained in:
136
koka_bench/picolisp/picolisp-cfold.l
Normal file
136
koka_bench/picolisp/picolisp-cfold.l
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#{
|
||||||
|
# Thanks to http://rosettacode.org/wiki/Multiline_shebang#PicoLisp
|
||||||
|
exec pil $0 $1
|
||||||
|
# }#
|
||||||
|
|
||||||
|
(de cadddddr (l) (car (cddr (cdddr l))))
|
||||||
|
|
||||||
|
(de caddddr (l) (car (cdr (cdddr l))))
|
||||||
|
|
||||||
|
(de mkexpr (n v) (cond ((= 0 n) (cond ((= 0 v) (list "var" 1 0))
|
||||||
|
(T (list "val" v 0))
|
||||||
|
))
|
||||||
|
(T (list "add" (mkexpr (- n 1) (+ v 1)) (mkexpr (- n 1) (max (- v 1) 0))))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de appendadd (expf exps) (let (S (car expf)
|
||||||
|
l (cadr expf)
|
||||||
|
r (caddr expf)
|
||||||
|
)
|
||||||
|
( case S
|
||||||
|
("add" (list "add" l (appendadd r exps)))
|
||||||
|
(T (list "add" expf exps))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de appendmul (expf exps) (let (S (car expf)
|
||||||
|
l (cadr expf)
|
||||||
|
r (caddr expf)
|
||||||
|
)
|
||||||
|
( case S
|
||||||
|
("mul" (list "mul" l (appendmul r exps)))
|
||||||
|
(T (list "mul" expf exps))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de reassoc (exp) (let (S (car exp)
|
||||||
|
l (cadr exp)
|
||||||
|
r (caddr exp)
|
||||||
|
)
|
||||||
|
( case S
|
||||||
|
("add" (appendadd (reassoc l) (reassoc r)))
|
||||||
|
("mul" (appendmul (reassoc l) (reassoc r)))
|
||||||
|
(T exp)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de cfold (exp) (let (S (car exp)
|
||||||
|
l (cadr exp)
|
||||||
|
r (caddr exp)
|
||||||
|
)
|
||||||
|
(case S
|
||||||
|
("add" (let (lc (cfold l)
|
||||||
|
rc (cfold r)
|
||||||
|
lcS (car lc)
|
||||||
|
lcl (cadr lc)
|
||||||
|
lcr (caddr lc)
|
||||||
|
rcS (car rc)
|
||||||
|
rcl (cadr rc)
|
||||||
|
rcr (caddr rc)
|
||||||
|
)
|
||||||
|
(cond ((= lcS "val") (cond ((= rcS "val) (list "val" (+ lcl rcl) 0))
|
||||||
|
((= rcS "add") (let (rclS (car rcl)
|
||||||
|
rcll (cadr rcl)
|
||||||
|
rclr (caddr rcl)
|
||||||
|
rcrS (car rcr)
|
||||||
|
rcrl (cadr rcr)
|
||||||
|
rcrr (caddr rcr)
|
||||||
|
)
|
||||||
|
(cond ((= rcrS "val") (list "add" (list "val" (+ lcl rcrl) 0) rcl))
|
||||||
|
((= rclS "val") (list "add" (list "val" (+ lcl rcll) 0) rcr))
|
||||||
|
(T (list "add" lc rc))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(T (list "mul" lc rc))
|
||||||
|
)
|
||||||
|
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(T (list "add" lc rc))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
("mul" (let (lc (cfold l)
|
||||||
|
rc (cfold r)
|
||||||
|
lcS (car lc)
|
||||||
|
lcl (cadr lc)
|
||||||
|
lcr (caddr lc)
|
||||||
|
rcS (car rc)
|
||||||
|
rcl (cadr rc)
|
||||||
|
rcr (caddr rc)
|
||||||
|
)
|
||||||
|
(cond ((= lcS "val") (cond ((= rcS "val) (list "val" (* lcl rcl) 0))
|
||||||
|
((= rcS "mul") (let (rclS (car rcl)
|
||||||
|
rcll (cadr rcl)
|
||||||
|
rclr (caddr rcl)
|
||||||
|
rcrS (car rcr)
|
||||||
|
rcrl (cadr rcr)
|
||||||
|
rcrr (caddr rcr)
|
||||||
|
)
|
||||||
|
(cond ((= rcrS "val") (list "mul" (list "val" (* lcl rcrl) 0) rcl))
|
||||||
|
((= rclS "val") (list "mul" (list "val" (* lcl rcll) 0) rcr))
|
||||||
|
(T (list "mul" lc rc))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(T (list "mul" lc rc))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(T (list "mul" lc rc))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(T exp)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de evalE (exp) (let ( S (car exp)
|
||||||
|
l (cadr exp)
|
||||||
|
r (caddr exp)
|
||||||
|
)
|
||||||
|
(case S
|
||||||
|
("add" (+ (evalE l) (evalE r) ))
|
||||||
|
("mul" (* (evalE l) (evalE r) ))
|
||||||
|
("var" 0)
|
||||||
|
("val" l)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(bye (println (evalE (cfold (reassoc (mkexpr (car (str (opt))) 1))))))
|
||||||
160
koka_bench/picolisp/picolisp-rbtree.l
Normal file
160
koka_bench/picolisp/picolisp-rbtree.l
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#{
|
||||||
|
# Thanks to http://rosettacode.org/wiki/Multiline_shebang#PicoLisp
|
||||||
|
exec pil $0 $1
|
||||||
|
# }#
|
||||||
|
|
||||||
|
(de cadddddr (l) (car (cddr (cdddr l))))
|
||||||
|
|
||||||
|
(de caddddr (l) (car (cdr (cdddr l))))
|
||||||
|
|
||||||
|
(de isRed (t) (let ( nA (car t)
|
||||||
|
nB (cadr t)
|
||||||
|
nC (caddr t)
|
||||||
|
nD (cadddr t)
|
||||||
|
nE (caddddr t)
|
||||||
|
nF (cadddddr t)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
case nB
|
||||||
|
("R" T)
|
||||||
|
(T NIL)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de balanceLeft (l k v r) (let ( nA (car l)
|
||||||
|
nB (cadr l)
|
||||||
|
nC (caddr l)
|
||||||
|
nD (cadddr l)
|
||||||
|
nE (caddddr l)
|
||||||
|
nF (cadddddr l)
|
||||||
|
nLA (car nC)
|
||||||
|
nLB (cadr nC)
|
||||||
|
nLC (caddr nC)
|
||||||
|
nLD (cadddr nC)
|
||||||
|
nLE (caddddr nC)
|
||||||
|
nLF (cadddddr nC)
|
||||||
|
nRA (car nF)
|
||||||
|
nRB (cadr nF)
|
||||||
|
nRC (caddr nF)
|
||||||
|
nRD (cadddr nF)
|
||||||
|
nRE (caddddr nF)
|
||||||
|
nRF (cadddddr nF)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
case nA
|
||||||
|
("N" (case (nLB)
|
||||||
|
("R" (list "N" "R" (list "N" "B" nLC nLD nLE nLF) nD nE (list "N" "B" nF k v r)))
|
||||||
|
(T (case (nRB)
|
||||||
|
("R" (list "N" "R" (list "N" "B" nC nD nE nRC) nRD nRE (list "N" "B" nRF k v r)))
|
||||||
|
(T (list "N" "B" (list "N" "R" nC nD nE nF) k v r))
|
||||||
|
))
|
||||||
|
))
|
||||||
|
(T (list "L" "C" 0 0 0 0))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
(de balanceRight (l k v r) (let ( nA (car r)
|
||||||
|
nB (cadr r)
|
||||||
|
nC (caddr r)
|
||||||
|
nD (cadddr r)
|
||||||
|
nE (caddddr r)
|
||||||
|
nF (cadddddr r)
|
||||||
|
nLA (car nC)
|
||||||
|
nLB (cadr nC)
|
||||||
|
nLC (caddr nC)
|
||||||
|
nLD (cadddr nC)
|
||||||
|
nLE (caddddr nC)
|
||||||
|
nLF (cadddddr nC)
|
||||||
|
nRA (car nF)
|
||||||
|
nRB (cadr nF)
|
||||||
|
nRC (caddr nF)
|
||||||
|
nRD (cadddr nF)
|
||||||
|
nRE (caddddr nF)
|
||||||
|
nRF (cadddddr nF)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
case nA
|
||||||
|
("N" (case nLB
|
||||||
|
("R" (list "N" "R" (list "N" "B" l k v nLC) nLD nLE (list "N" "B" nLF nD nE nF)))
|
||||||
|
(T (case nRB
|
||||||
|
("R" (list "N" "R" (list "N" "B" l k v nC) nD nE (list "N" "B" nRC nRD nRE nRF)))
|
||||||
|
(T (list "N" "B" l k v (list "N" "R" nC nD nE nF)))
|
||||||
|
))
|
||||||
|
))
|
||||||
|
(T (list "L" "C" 0 0 0 0))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
(de ins (t k v) (let ( nA (car t)
|
||||||
|
nB (cadr t)
|
||||||
|
nC (caddr t)
|
||||||
|
nD (cadddr t)
|
||||||
|
nE (caddddr t)
|
||||||
|
nF (cadddddr t)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
case nB
|
||||||
|
("R" (cond ((< k nD) (list "N" "R" (ins nC k v) nD nE nF))
|
||||||
|
((> k nD) (list "N" "R" nC nD nE (ins nF k v)))
|
||||||
|
(T (list "N" "R" nC nD nE nF))
|
||||||
|
))
|
||||||
|
("B" (cond ((< k nD) (if (isRed nC) (balanceLeft (ins nC k v) nD nE nF) (list "N" "B" (ins nC k v) nD nE nF)))
|
||||||
|
((> k nD) (if (isRed nF) (balanceRight nC nD nE (ins nF k v)) (list "N" "B" nC nD nE (ins nF k v))))
|
||||||
|
(T (list "N" "B" nC nD nE nF))
|
||||||
|
))
|
||||||
|
(T (list "N" "R" (list "L" "C" 0 0 0 0) nD nE (list "L" "C" 0 0 0 0)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de setBlack (t) (let (nA (car t)
|
||||||
|
nB (cadr t)
|
||||||
|
nC (caddr t)
|
||||||
|
nD (cadddr t)
|
||||||
|
nE (caddddr t)
|
||||||
|
nF (cadddddr t)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
case nA
|
||||||
|
("N" (list nA "B" nC nD nE nF))
|
||||||
|
(T t)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de insertT (t k v) (setBlack (ins t k v)))
|
||||||
|
|
||||||
|
(de foldT (t b) (let (nA (car t)
|
||||||
|
nB (cadr t)
|
||||||
|
nC (caddr t)
|
||||||
|
nD (cadddr t)
|
||||||
|
nE (caddddr t)
|
||||||
|
nF (cadddddr t)
|
||||||
|
)
|
||||||
|
(
|
||||||
|
case nA
|
||||||
|
("N" (foldT nF (+ (foldT nC b) 1)))
|
||||||
|
(T b)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de makeTreeAux (n t) (cond ((<= n 0) t)
|
||||||
|
(T (let (nA (- n 1)
|
||||||
|
) (makeTreeAux nA (insertT t nA nA))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(de makeTree (n) (makeTreeAux n (list "L" "C" 0 0 0 0)))
|
||||||
|
|
||||||
|
(bye (println ( foldT (makeTree (car (str (opt)))) 0)))
|
||||||
Reference in New Issue
Block a user