Skip to content

Commit

Permalink
Add FLUID-LET.
Browse files Browse the repository at this point in the history
  • Loading branch information
manuel committed Mar 19, 2012
1 parent 0a3c7c8 commit 498bae0
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 0 deletions.
6 changes: 6 additions & 0 deletions standard.virtua
Expand Up @@ -159,6 +159,12 @@
(eval (list* (setter (eval cmb env)) value args) env))
(eval (list $set! place value) env)))

(defmacro fluid-let ((name value) . body) env
(let ((saved-value (eval name env)))
(eval (list set! name value) env)
(unwind-protect (eval (list* begin body) env)
(eval (list set! name saved-value) env))))

(defun setter (obj) (get-slot obj "setter"))
(defun set-setter! (obj setter) (set-slot! obj "setter" setter))
(set-setter! js-global (lambda (val name) (set-js-global! name val))) ; erm
Expand Down
11 changes: 11 additions & 0 deletions test.virtua
Expand Up @@ -159,6 +159,17 @@

(assert (= "foobar" (strcat "foo" "bar")))

(scope
(def x 1)
(fluid-let (x 2)
(assert (= x 2)))
(assert (= x 1))
(block exit
(fluid-let (x 3)
(assert (= x 3))
(return-from exit)))
(assert (= x 1)))

;;;; Options

(assert (= 12 (if-option (name (option 12)) name 13)))
Expand Down

0 comments on commit 498bae0

Please sign in to comment.