遍历方案用作列表

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) - 这是误导.我问,为什么我不能作为列表访问函数?

Dav*_*rak 3

我经常希望能够在 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)