`(%js-lambda ,effective-args
,@effective-body)))
+(defpsmacro flet (fn-defs &rest body)
+ (flet ((process-fn-def (def)
+ `(var ,(car def) (lambda ,@(cdr def)))))
+ `(progn ,@(mapcar #'process-fn-def fn-defs) ,@body)))
+
+(defpsmacro labels (fn-defs &rest body)
+ (flet ((process-fn-def (def)
+ `(var ,(car def) (defun ,(car def) ,@(cdr def)))))
+ `(progn ,@(mapcar #'process-fn-def fn-defs) ,@body)))
+
(defpsmacro defsetf-long (access-fn lambda-list (store-var) form)
(setf (get-macro-spec access-fn *ps-setf-expanders*)
(compile nil
symbol)
(:span :class "ticker-symbol-popup")))
"'<SPAN CLASS=\"ticker-symbol\" TICKER-SYMBOL=\"' + symbol + '\"><A HREF=\"http://foo.com\">' + symbol + '</A><SPAN CLASS=\"ticker-symbol-popup\"/></SPAN>'")
+
+(test-ps-js flet1
+ ((lambda () (flet ((foo (x) (return (1+ x)))) (return (foo 1)))))
+ "(function () {
+ var foo = function (x) {
+ return x + 1;
+ };
+ return foo(1);
+})()")
+
+(test-ps-js labels1
+ ((lambda () (labels ((foo (x)
+ (return (if (=== 0 x)
+ 0
+ (+ x (foo (1- x)))))))
+ (return (foo 3)))))
+ "(function () {
+ var foo = function foo(x) {
+ return 0 === x ? 0 : x + foo(x - 1);
+ };
+ return foo(3);
+})()")