From 9af29f28da68b06c918ede6f31baed6f6d0bf4fb Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Sun, 11 Apr 2010 17:38:21 -0500 Subject: [PATCH] Commit basic (and ...) & (or ...) *functions*, with lambda args. --- src/examples/test-and.rla | 26 +++++++++++++++++ src/examples/test-or.rla | 26 +++++++++++++++++ src/lib/primitive/and.rla | 60 +++++++++++++++++++++++++++++++++++++++ src/lib/primitive/or.rla | 60 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+) create mode 100644 src/examples/test-and.rla create mode 100644 src/examples/test-or.rla create mode 100644 src/lib/primitive/and.rla create mode 100644 src/lib/primitive/or.rla diff --git a/src/examples/test-and.rla b/src/examples/test-and.rla new file mode 100644 index 0000000..ed1940b --- /dev/null +++ b/src/examples/test-and.rla @@ -0,0 +1,26 @@ +#S(#="lambda" + ; (define (test-and) + ; (and (lambda () 3) + ; (lambda () #t) + ; (lambda () 4) + ; (lambda () #f) + ; (lambda () 5))) + #( + #i"../lib/primitive/and.rla" + ( + #S(#="lambda" #(( 3) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + #S(#="lambda" #((#t) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + #S(#="lambda" #(( 4) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + #S(#="lambda" #((#f) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + #S(#="lambda" #(( 5) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + ) + ) + #() + 0 + "" + 0x01 ; g1 + 0x02 ; g2 + 0xfe ; k + 0xff ; ctx +) +; vim:set syntax= sw=2 expandtab: diff --git a/src/examples/test-or.rla b/src/examples/test-or.rla new file mode 100644 index 0000000..a416e29 --- /dev/null +++ b/src/examples/test-or.rla @@ -0,0 +1,26 @@ +#S(#="lambda" + ; (define (test-or) + ; (and (lambda () #f) + ; (lambda () 3) + ; (lambda () #f) + ; (lambda () #t) + ; (lambda () #f))) + #( + #i"../lib/primitive/or.rla" + ( + #S(#="lambda" #((#f) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + #S(#="lambda" #(( 3) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + #S(#="lambda" #((#f) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + #S(#="lambda" #((#t) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + #S(#="lambda" #((#f) #f) #() 0 "" 0xfe 0x01 0x02 0x02) + ) + ) + #() + 0 + "" + 0x01 ; g1 + 0x02 ; g2 + 0xfe ; k + 0xff ; ctx +) +; vim:set syntax= sw=2 expandtab: diff --git a/src/lib/primitive/and.rla b/src/lib/primitive/and.rla new file mode 100644 index 0000000..23444ea --- /dev/null +++ b/src/lib/primitive/and.rla @@ -0,0 +1,60 @@ +;; Evaluates each function in turn, returning #f immediately if any +;; function returns #f, or else the first result of the last function. + +; (define (and . fns) +; (let/cc k +; (foldl (lambda (fn _) +; (let/cc k2 +; ((lambda (x) +; ((if x k2 k) x)) +; (fn)))) +; #t +; fns)) + +#S(#="lambda" + #( + #i"foldl.rla" + #S(#="template" + ; (lambda (fn _) + ; (let/cc k2 + ; ((lambda (x) + ; ((if x k2 k) x)) + ; (fn)))) + #( + #S(#="template" + ; (lambda (x) + ; ((if x k2 k) x)) + #(#f) + "\x40\xfe" ; i0 k + 1 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x80\x80\x41\x40"; (set! f0 (if f0 i1 i0)) + 0x80 ; f0 + 0xfd ; argv + 0x01 ; g1 + 0x01 ; g1 + ) + ) + "\xfe" ; k + 2 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x00\x81\x1b\x01"; (set! f1 (lambda g1)) + 0x80 ; f0 + 0x00 ; nil + 0x81 ; f1 + 0xff ; ctx + ) + #t + ) + #() + 2 + "\x02\x80\xfd\x00\; (set! f0 (cons argv nil)) + \x02\x80\x03\x80\; (set! f0 (cons g3 f0)) + \x00\x81\x1b\x02\; (set! f1 (lambda g2)) + \x02\x80\x81\x80"; (set! f0 (cons f1 f0)) + 0x01 ; g1 + 0x80 ; f0 + 0xfe ; k + 0xff ; ctx +) +; vim:set syntax= sw=2 expandtab: diff --git a/src/lib/primitive/or.rla b/src/lib/primitive/or.rla new file mode 100644 index 0000000..8048a16 --- /dev/null +++ b/src/lib/primitive/or.rla @@ -0,0 +1,60 @@ +;; Evaluates each function in turn, immediately returning the first +;; non-#f result, or #f if no function returns a non-#f result. + +; (define (or . fns) +; (let/cc k +; (foldl (lambda (fn _) +; (let/cc k2 +; ((lambda (x) +; ((if x k k2) x)) +; (fn)))) +; #f +; fns)) + +#S(#="lambda" + #( + #i"foldl.rla" + #S(#="template" + ; (lambda (fn _) + ; (let/cc k2 + ; ((lambda (x) + ; ((if x k2 k) x)) + ; (fn)))) + #( + #S(#="template" + ; (lambda (x) + ; ((if x k2 k) x)) + #(#f) + "\x40\xfe" ; i0 k + 1 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x80\x80\x40\x41"; (set! f0 (if f0 i0 i1)) + 0x80 ; f0 + 0xfd ; argv + 0x01 ; g1 + 0x01 ; g1 + ) + ) + "\xfe" ; k + 2 + "\x00\x80\x03\xfd\; (set! f0 (car argv)) + \x00\x81\x1b\x01"; (set! f1 (lambda g1)) + 0x80 ; f0 + 0x00 ; nil + 0x81 ; f1 + 0xff ; ctx + ) + #f + ) + #() + 2 + "\x02\x80\xfd\x00\; (set! f0 (cons argv nil)) + \x02\x80\x03\x80\; (set! f0 (cons g3 f0)) + \x00\x81\x1b\x02\; (set! f1 (lambda g2)) + \x02\x80\x81\x80"; (set! f0 (cons f1 f0)) + 0x01 ; g1 + 0x80 ; f0 + 0xfe ; k + 0xff ; ctx +) +; vim:set syntax= sw=2 expandtab: