spec: promises — delay/force/delay-force/make-promise/promise?
25 tests pass on OCaml (4357 total) and JS. Promise represented as
mutable dict {:_promise true :forced :thunk :value}; delay-force
adds :_iterative for chain-following semantics.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2037,8 +2037,10 @@
|
||||
nil))))
|
||||
|
||||
(define
|
||||
values
|
||||
(fn (&rest vs) (if (= (len vs) 1) (first vs) {:_values true :_list vs})))
|
||||
sf-delay
|
||||
(fn
|
||||
(args env)
|
||||
(let ((thunk (make-lambda (list) (first args) env))) {:forced false :value nil :thunk thunk :_promise true})))
|
||||
|
||||
;; ═══════════════════════════════════════════════════════════════
|
||||
;; Part 11: Entry Points
|
||||
@@ -2047,6 +2049,42 @@
|
||||
;; eval-expr / trampoline: top-level bindings that override the
|
||||
;; forward declarations from Part 5.
|
||||
;; ═══════════════════════════════════════════════════════════════
|
||||
(define
|
||||
sf-delay-force
|
||||
(fn
|
||||
(args env)
|
||||
(let ((thunk (make-lambda (list) (first args) env))) {:_iterative true :forced false :value nil :thunk thunk :_promise true})))
|
||||
|
||||
(define promise? (fn (v) (and (dict? v) (get v :_promise false))))
|
||||
|
||||
(define make-promise (fn (v) {:forced true :value v :_promise true}))
|
||||
|
||||
(define
|
||||
force
|
||||
(fn
|
||||
(p)
|
||||
(if
|
||||
(not (promise? p))
|
||||
p
|
||||
(if
|
||||
(get p :forced false)
|
||||
(get p :value nil)
|
||||
(let
|
||||
((result (apply (get p :thunk nil) (list))))
|
||||
(let
|
||||
((final (if (and (get p :_iterative false) (promise? result)) (force result) result)))
|
||||
(dict-set! p :forced true)
|
||||
(dict-set! p :value final)
|
||||
final))))))
|
||||
|
||||
(register-special-form! "delay" sf-delay)
|
||||
|
||||
(register-special-form! "delay-force" sf-delay-force)
|
||||
|
||||
(define
|
||||
values
|
||||
(fn (&rest vs) (if (= (len vs) 1) (first vs) {:_values true :_list vs})))
|
||||
|
||||
(register-special-form! "define-type" sf-define-type)
|
||||
|
||||
(define
|
||||
|
||||
Reference in New Issue
Block a user