如何检查符号是否是程序

时间:2012-03-07 07:42:57

标签: scheme guile

我试着编写一个检查列表的宏来查看是否有程序调用,但我不太清楚如何去做。我头脑中的第一件事就是使用这个程序?功能检查,但它不起作用。我试图做的一个例子如下:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

如果列表的格式为'(a b c d),您可以这样检查:

(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))))

答案 1 :(得分: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)))