我试着编写一个检查列表的宏来查看是否有程序调用,但我不太清楚如何去做。我头脑中的第一件事就是使用这个程序?功能检查,但它不起作用。我试图做的一个例子如下:
(procedure? (car '(+ 1 2)))
现在,该列表的汽车返回+
,但该函数仍返回false
。
有没有办法检查列表的车是否是程序?
答案 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)))