Code: Select all
(define (myfun2 fun)
(let ((a 20))
(apply fun '())
)
)
(define (myfun)
(let ((a 10))
(myfun2
(lambda ()
(setq a 30))
)
a
)
)
(print (myfun))
(exit)
Code: Select all
(define (myfun2 fun)
(let ((a 20))
(apply fun '())
)
)
(define (myfun)
(let ((a 10))
(myfun2
(lambda ()
(setq a 30))
)
a
)
)
(print (myfun))
(exit)
Code: Select all
(define (myfun2 fun)
(let ((a 20))
(apply fun '())
)
)
(define (myfun)
(let ((myfun:a 10))
(myfun2
(lambda ()
(setq myfun:a 30))
)
myfun:a
)
)
(print (myfun))
(exit)
Code: Select all
(lambda()(setf a 3))
Code: Select all
(lambda()(let((a 4))(setf a 3))).
Code: Select all
(define-macro (ifnt condition else then)
(if (eval condition)
(eval then)
(eval else)))
Code: Select all
(ifnt (< a b) (setf a 4)(setf b 4))
Code: Select all
(define (gensym)
(inc gensym-counter)
(sym (append "G-" (string gensym-counter))))
Code: Select all
(set-protected1 'ifnt (lambda(c e t)(if (eval c)(eval t)(eval e)))
'(e c t))
Code: Select all
(lambda([ifnt.c] [ifnt.e] [ifnt.t])
(if (eval [ifnt.c])
(eval [ifnt.t])
(eval [ifnt.e])))
Code: Select all
> (context 'ifnt)
ifnt
ifnt> (define-macro (ifnt:ifnt c e t)(if (eval c) (eval t) (eval e)))
(lambda-macro (c e t)
(if (eval c)
(eval t)
(eval e)))
ifnt> (context 'MAIN)
MAIN
> (ifnt (< 2 3) ">=" "<")
"<"
> ifnt:ifnt
(lambda-macro (ifnt:c ifnt:e ifnt:t)
(if (eval ifnt:c)
(eval ifnt:t)
(eval ifnt:e)))
>
Code: Select all
(define (def-static s body)
(def-new 'body (sym s s)))
Code: Select all
> (def-static 'acc (fn (x) (inc sum x)))
acc:acc
> (acc 1)
1
> (acc 1)
2
> (acc 1)
3
> (acc 5)
8
> acc:acc
(lambda (acc:x) (inc acc:sum acc:x))
>
Thank you for the nice solution!Lutz wrote:Here is a function you can use to define functions as default functors in their own space:
and use like this:Code: Select all
(define (def-static s body) (def-new 'body (sym s s)))
fn is the same as lambda but quicker to write.Code: Select all
> (def-static 'acc (fn (x) (inc sum x))) acc:acc > (acc 1) 1 > (acc 1) 2 > (acc 1) 3 > (acc 5) 8 > acc:acc (lambda (acc:x) (inc acc:sum acc:x)) >
Code: Select all
> (def-static 'mysetq (lambda-macro (p1 p2) (set p1 (eval p2))))
mysetq:mysetq
> (mysetq x 123)
123
Code: Select all
> mysetq:mysetq
(lambda-macro (mysetq:p1 mysetq:p2) (set mysetq:p1 (eval mysetq:p2)))
>