diff --git a/src/examples/test-map.rla b/src/examples/test-map.rla new file mode 100644 index 0000000..3aa8d53 --- /dev/null +++ b/src/examples/test-map.rla @@ -0,0 +1,19 @@ +#S(#="lambda" + ; (define (test-map) + ; (map list '(2 3 4 5))) + #( + #i"../lib/primitive/map.rla" + ( + #i"../lib/primitive/list.rla" + (2 3 4 5) + ) + ) + #() + 0 + "" + 0x01 ; g1 + 0x02 ; g2 + 0xfe ; k + 0xff ; ctx +) +; vim:set syntax= sw=2 expandtab: diff --git a/src/examples/test-reverse.rla b/src/examples/test-reverse.rla new file mode 100644 index 0000000..288ccad --- /dev/null +++ b/src/examples/test-reverse.rla @@ -0,0 +1,16 @@ +#S(#="lambda" + ; (define (test-reverse) + ; (reverse '(2 3 4 5)) + #( + #i"../lib/primitive/reverse.rla" + ((2 3 4 5)) + ) + #() + 0 + "" + 0x01 ; g1 + 0x02 ; g2 + 0xfe ; k + 0xff ; ctx +) +; vim:set syntax= sw=2 expandtab: diff --git a/src/lib/primitive/acons.rla b/src/lib/primitive/acons.rla new file mode 100644 index 0000000..248d3d7 --- /dev/null +++ b/src/lib/primitive/acons.rla @@ -0,0 +1,20 @@ +#S(#="lambda" + ; (define (acons a b lst) + ; (cons a (cons b lst))) + #(#f) + #() + 3 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x00\x82\x04\xfd\; (set! f2 (cdr argv)) + \x00\x81\x03\x82\; (set! f1 (car f2)) + \x00\x82\x04\x82\; (set! f2 (cdr f2)) + \x00\x82\x03\x82\; (set! f2 (car f2)) + \x02\x81\x81\x82\; (set! f1 (cons f1 f2)) + \x02\x80\x80\x81\; (set! f0 (cons f0 f1)) + \x02\x80\x80\x00"; (set! f0 (cons f0 nil)) + 0xfe ; k + 0x80 ; f0 + 0x01 ; g1 + 0x01 ; g1 +) +; vim:set syntax= sw=2 expandtab: diff --git a/src/lib/primitive/map.rla b/src/lib/primitive/map.rla new file mode 100644 index 0000000..7c3943f --- /dev/null +++ b/src/lib/primitive/map.rla @@ -0,0 +1,71 @@ +#S(#="lambda" + ; (define (map fn lst) + ; (reverse (foldl (lambda (x lst) + ; (cons (fn x) lst)) + ; () + ; lst))) + #( + #i"foldl.rla" + #S(#="template" + ; (lambda (x rlst) + ; (let/cc k + ; (call-with-multiple-values + ; (lambda (y) (k (cons y rlst))) + ; (lambda () (fn x))))) + #( + #S(#="template" + ; (lambda (y) + ; (k (cons y rlst))) + #(#f) + "\x81\xfe\xff" ; f1 k ctx + 1 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x02\x80\x80\x40\; (set! f0 (cons f0 i0)) + \x02\x80\x80\x00"; (set! f0 (cons f0 nil)) + 0x41 ; i1 + 0x80 ; f0 + 0x01 ; g1 + 0x01 ; g1 + ) + ) + "\x80" + 2 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x00\x81\x04\xfd\; (set! f1 (cdr argv)) + \x00\x81\x03\x81\; (set! f1 (car f1)) + \x00\x81\x1b\x01\; (set! f1 (lambda g1)) + \x02\x80\x80\x00"; (set! f0 (cons f0 nil)) + 0x40 ; i0 + 0x80 ; f0 + 0x81 ; f1 + 0xff ; ctx + ) + #S(#="template" + ; (lambda (rlst) + ; (k (reverse rlst))) + #(#f #i"reverse.rla") + "\xfe" + 0 + "" + 0x02 ; g2 + 0xfd ; argv + 0x40 ; i0 + 0x01 ; g1 + ) + ) + #() + 4 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x00\x81\x04\xfd\; (set! f1 (cdr argv)) + \x00\x81\x03\x81\; (set! f1 (car f1)) + \x02\x82\x81\x00\; (set! f2 (cons f1 nil)) + \x02\x82\x00\x82\; (set! f2 (cons nil f2)) + \x00\x83\x1b\x02\; (set! f3 (lambda g2)) + \x02\x82\x83\x82\; (set! f2 (cons f3 f2)) + \x00\x83\x1b\x03"; (set! f3 (lambda g3)) + 0x01 ; g1 + 0x82 ; f2 + 0x83 ; f3 + 0xff ; ctx +) +; vim:set syntax= sw=2 expandtab: diff --git a/src/lib/primitive/reverse.rla b/src/lib/primitive/reverse.rla new file mode 100644 index 0000000..1b128fd --- /dev/null +++ b/src/lib/primitive/reverse.rla @@ -0,0 +1,20 @@ +;; Returns a reversed copy of the given list +; (define (reverse lst) +; (foldl cons nil lst)) +#S(#="lambda" + #( + #i"foldl.rla" + #i"cons.rla" + ) + #() + 1 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x02\x80\x80\x00\; (set! f0 (cons f0 nil)) + \x02\x80\x00\x80\; (set! f0 (cons nil f0)) + \x02\x80\x02\x80"; (set! f0 (cons g2 f0)) + 0x01 ; g1 + 0x80 ; f0 + 0xfe ; k + 0xff ; ctx +) +; vim:set syntax= sw=2 expandtab: