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:
2026-09-29 16:09:51 +03:00
parent ca88d9b386
commit aa5cfc1b7d
3 changed files with 20 additions and 25 deletions

View File

@@ -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))

View File

@@ -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))))

View File

@@ -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))