csl*_*csl 8 lisp reflection scheme metaprogramming homoiconicity
是不是可以将Scheme中的函数视为任何其他列表?
基本上,我想要做的是这样的:
(define (foo) "hello")
(cdr foo) ; or similar, should return the list ((foo) "hello")
Run Code Online (Sandbox Code Playgroud)
我已经找到了类似的讨论,如果这不能用于Scheme,我会感到有点失望.如果是这样,为什么这是不可能的?在其他的lisps有可能吗?
编辑:改为(cdr'foo)为(cdr foo) - 这是误导.我问,为什么我不能作为列表访问函数?
我经常希望能够在 csl 中做同样的事情。以下是如何在 mzscheme 中执行此操作的快速示例。
博士方案4.2
(module qdefine mzscheme
(provide ;(all-from-except mzscheme let)
(rename define olddefine)
(rename quote-define define)
(rename quote-cdr cdr)
(rename quote-car car))
(define define-list '())
(define define-list-add
(lambda (key value)
(set! define-list (cons `(,key ,value) define-list))))
(define-syntax quote-define
(syntax-rules ()
((_ (pro-name args ...) body ...)
(begin
(define (pro-name args ...) body ...)
(define-list-add pro-name '((pro-name args ...) body ...))))
((_ pro-name pro) (begin
(define pro-name pro)
(define-list-add pro-name 'pro)))
))
(define quote-cdr (lambda (lst)
(if (procedure? lst)
(cdr (cadr (assoc lst define-list)))
(cdr lst))))
(define quote-car (lambda (lst)
(if (procedure? lst)
(car (cadr (assoc lst define-list)))
(car lst))))
)
(require 'qdefine)
(define testfunc (lambda (args) args))
(cdr testfunc)
(car testfunc)
(define (testfunc2 test) 'blah)
(cdr testfunc2)
(car testfunc2)
(define testlist '(1 2 3 4 5 6 'a))
(cdr testlist)
(car testlist)
Run Code Online (Sandbox Code Playgroud)
输出:
((args) args)
lambda
('blah)
(testfunc2 test)
(2 3 4 5 6 'a)
1
>
Run Code Online (Sandbox Code Playgroud)