2

我正在尝试编写一个宏来检查列表以查看是否有过程调用,但我不太确定如何去做。我首先想到的是使用程序?功能检查,但它不起作用。我试图做的一个例子如下:

(procedure? (car '(+ 1 2)))

现在,该列表的汽车返回+,但函数仍然返回false

有没有办法检查列表中的汽车是否是程序?

4

2 回答 2

3
(car '(+ 1 2)) => '+ not +

+是一个过程,但'+只是一个符号!

你应该检查一个未引用的变量:

(procedure? (car (list + 1 2))); => #t
;or
(procedure? (car `(,+ 1 2))); =>#t

如果列表的格式为 '(abcd),您可以通过以下方式检查:

(procedure? (eval (car '(+ 1 2)) (interaction-environment)));=>#t

因为:

(eval (car '(+ 1 2)) (interaction-environment))
;=>(eval '+ (interaction-environment))
;=>+

我不认为你在这里需要一个宏,一个函数就足够了。抽象该功能:

(define (application-form? lst) 
      (procedure? (eval (car lst) (interaction-environment))))
于 2012-03-07T09:20:50.780 回答
1

如果car允许列表的 是未绑定的符号,则此问题不可移植。但是,您可以在 Guile 中解决它:

(define (procedure-symbol? x)
  (and (symbol? x)
       (let ((var (module-variable (interaction-environment) x)))
         (and var
              (variable-bound? var)
              (procedure? (variable-ref var))))))

(define (application-form? lst)
  (procedure-symbol? (car lst)))
于 2012-03-07T10:15:08.083 回答