remove capture list from lambdas, they are always pure
Explicitly rename capturing lambdas to closures, they will be implemented later
This commit is contained in:
@@ -10,12 +10,12 @@
|
|||||||
|
|
||||||
(var sum-lambda (fn ((int) (int)) int)
|
(var sum-lambda (fn ((int) (int)) int)
|
||||||
|
|
||||||
(lambda ((a int) (b int)) int ()
|
(lambda ((a int) (b int)) int
|
||||||
(return (+ a b))))
|
(return (+ a b))))
|
||||||
|
|
||||||
(var sum-lambda-2 (fn ((int)) int)
|
(var sum-lambda-2 (fn ((int)) int)
|
||||||
|
|
||||||
(lambda ((a int)) int ()
|
(lambda ((a int)) int
|
||||||
(return (+ a 20))))
|
(return (+ a 20))))
|
||||||
|
|
||||||
(printf "Hello from main fn!\n")
|
(printf "Hello from main fn!\n")
|
||||||
@@ -24,28 +24,25 @@
|
|||||||
(printf "Calling fn ptr: %d\n" (sum-fn a b))
|
(printf "Calling fn ptr: %d\n" (sum-fn a b))
|
||||||
(printf "Calling lambda: %d\n" (sum-lambda a b))
|
(printf "Calling lambda: %d\n" (sum-lambda a b))
|
||||||
(printf "Calling other lambda: %d\n" (sum-lambda-2 a))
|
(printf "Calling other lambda: %d\n" (sum-lambda-2 a))
|
||||||
(printf "Calling lambda inplace: %d\n" ((lambda ((a int) (b int)) int ()
|
(printf "Calling lambda inplace: %d\n" ((lambda ((a int) (b int)) int
|
||||||
(return (+ a b 100)))
|
(return (+ a b 100)))
|
||||||
a b))
|
a b))
|
||||||
|
|
||||||
(var l-1 (fn ((int)) int)
|
(var l-1 (fn ((int)) int)
|
||||||
(lambda ((a int)) int ()
|
(lambda ((a int)) int
|
||||||
(var l-2 (fn ((int)) int)
|
(var l-2 (fn ((int)) int)
|
||||||
(lambda ((a int)) int ()
|
(lambda ((a int)) int
|
||||||
(return (+ 60 a))))
|
(return (+ 60 a))))
|
||||||
(return (+ 600 (l-2 a)))))
|
(return (+ 600 (l-2 a)))))
|
||||||
(printf "Calling nested lambdas: %d\n" (l-1 6))
|
(printf "Calling nested lambdas: %d\n" (l-1 6))
|
||||||
|
|
||||||
;; Not supported yet
|
;; Not supported yet -- captures belong to `closure' now, see
|
||||||
;; Closure
|
;; Function-values.org
|
||||||
;; (var (fn (fn ((int)) int) ((int))) make-adder
|
;; (fn make-adder ((a int)) (closure ((int)) int)
|
||||||
;; (lambda (fn int ((int a))) ()
|
;; (return (closure ((b int)) int (a)
|
||||||
;; (return (lambda int ((int b)) (a)
|
;; (return (+ a b)))))
|
||||||
;; (return (+ a b))))))
|
|
||||||
;;
|
;;
|
||||||
;; (var (fn int ((int))) add-10
|
;; (var add-10 (closure ((int)) int) (make-adder 10))
|
||||||
;; (make-adder 10))
|
;; (var add-20 (closure ((int)) int) (make-adder 20))
|
||||||
;; (var (fn int ((int))) add-20
|
;; (printf "Calling closures: %d %d\n" (add-10 24) (add-20 24))
|
||||||
;; (make-adder 20))
|
|
||||||
;; (printf "Calling closures: %d\n" (add-10 24))
|
|
||||||
(return 0))
|
(return 0))
|
||||||
|
|||||||
@@ -242,7 +242,7 @@
|
|||||||
(let ((lambda-name (make-lambda-name (hash-table-ref env :fn-name)
|
(let ((lambda-name (make-lambda-name (hash-table-ref env :fn-name)
|
||||||
(hash-table-ref env :lambda-counter))))
|
(hash-table-ref env :lambda-counter))))
|
||||||
(set! (hash-table-ref env :lambda-aux-code)
|
(set! (hash-table-ref env :lambda-aux-code)
|
||||||
(append (make-aux-lambda-struct lambda-name form)
|
(append (lift-lambda lambda-name form)
|
||||||
(hash-table-ref env :lambda-aux-code)))
|
(hash-table-ref env :lambda-aux-code)))
|
||||||
(set! (hash-table-ref env :lambda-counter)
|
(set! (hash-table-ref env :lambda-counter)
|
||||||
(+ (hash-table-ref env :lambda-counter) 1))
|
(+ (hash-table-ref env :lambda-counter) 1))
|
||||||
@@ -253,11 +253,9 @@
|
|||||||
(string->symbol
|
(string->symbol
|
||||||
(fmt #f "__lambda_" counter "_" enclosing-fn-name)))
|
(fmt #f "__lambda_" counter "_" enclosing-fn-name)))
|
||||||
|
|
||||||
(define (make-aux-lambda-struct name form)
|
(define (lift-lambda name form)
|
||||||
(match form
|
(match form
|
||||||
(('lambda arglist ret-type captures . body)
|
(('lambda arglist ret-type . body)
|
||||||
;; Captures are ignored for now, but
|
|
||||||
;; we'll need them for TODO: closures support
|
|
||||||
(process-fn (copy-form-source! form `(fn ,name ,arglist ,ret-type ,@body))
|
(process-fn (copy-form-source! form `(fn ,name ,arglist ,ret-type ,@body))
|
||||||
(list)))
|
(list)))
|
||||||
(else (sex-error form "malformed lambda" form))))
|
(else (sex-error form "malformed lambda" form))))
|
||||||
|
|||||||
@@ -22,21 +22,21 @@
|
|||||||
(printf "Named fn through a pointer: %d\n" (sum-fn a b))
|
(printf "Named fn through a pointer: %d\n" (sum-fn a b))
|
||||||
|
|
||||||
(var sum-lambda (fn ((int) (int)) int)
|
(var sum-lambda (fn ((int) (int)) int)
|
||||||
(lambda ((a int) (b int)) int ()
|
(lambda ((a int) (b int)) int
|
||||||
(return (+ a b))))
|
(return (+ a b))))
|
||||||
(printf "Lambda through a pointer: %d\n" (sum-lambda a b))
|
(printf "Lambda through a pointer: %d\n" (sum-lambda a b))
|
||||||
|
|
||||||
(printf "Lambda called in place: %d\n"
|
(printf "Lambda called in place: %d\n"
|
||||||
((lambda ((a int) (b int)) int ()
|
((lambda ((a int) (b int)) int
|
||||||
(return (+ a b 100)))
|
(return (+ a b 100)))
|
||||||
a b))
|
a b))
|
||||||
|
|
||||||
;; A lambda inside a lambda: the inner one is lifted out of a
|
;; A lambda inside a lambda: the inner one is lifted out of a
|
||||||
;; function that is itself being lifted
|
;; function that is itself being lifted
|
||||||
(var outer (fn ((int)) int)
|
(var outer (fn ((int)) int)
|
||||||
(lambda ((x int)) int ()
|
(lambda ((x int)) int
|
||||||
(var inner (fn ((int)) int)
|
(var inner (fn ((int)) int)
|
||||||
(lambda ((y int)) int ()
|
(lambda ((y int)) int
|
||||||
(return (+ 60 y))))
|
(return (+ 60 y))))
|
||||||
(return (+ 600 (inner x)))))
|
(return (+ 600 (inner x)))))
|
||||||
(printf "Nested lambdas: %d\n" (outer 6))
|
(printf "Nested lambdas: %d\n" (outer 6))
|
||||||
|
|||||||
Reference in New Issue
Block a user