Scheme 如何检查符号是否为过程

Scheme 如何检查符号是否为过程,scheme,guile,Scheme,Guile,我正试图编写一个宏来检查列表,看看是否有过程调用,但我不太确定如何执行。我想到的第一件事就是使用这个程序?函数进行检查,但它不起作用。我尝试做的一个例子如下: (procedure? (car '(+ 1 2))) 现在,该列表的car返回+,但函数仍然返回false 有没有办法检查列表中的car是否是一个程序 (car '(+ 1 2)) => '+ not + +是一个过程,但'+只是一个符号 您应该检查一个无引号的变量: (procedure? (car (list + 1 2)

我正试图编写一个宏来检查列表,看看是否有过程调用,但我不太确定如何执行。我想到的第一件事就是使用这个程序?函数进行检查,但它不起作用。我尝试做的一个例子如下:

(procedure? (car '(+ 1 2)))
现在,该列表的car返回
+
,但函数仍然返回
false

有没有办法检查列表中的car是否是一个程序

(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))))
+是一个过程,但'+只是一个符号

您应该检查一个无引号的变量:

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

如果允许列表中的
car
为未绑定符号,则此问题无法通过移植解决。然而,你可以用诡计来解决它:

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

如果允许列表中的
car
为未绑定符号,则此问题无法通过移植解决。然而,你可以用诡计来解决它:

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

如果列表的
car
是未绑定的符号,则会出现错误。(恐怕这并不是一个容易解决的问题,虽然……)我明白了,但是,考虑一下情况:(应用表单)((lambda(x)x)1),当然汽车零件(lambda(x)x)是一个过程,但是它返回了所有的类型谓词,包括“程序”、“对”、“列表”?在其参数未绑定的情况下引发错误。因此我认为我们的过程应该具有相同的行为。您是对的,我没有考虑过窗体的
car
本身是复合窗体的情况。好。。。我想哪个解决方案更可取取决于问题的确切陈述。事实上,只使用
(定义申请表?对?
)是有道理的如果列表的
car
是未绑定的符号,则会出现错误。(恐怕这并不是一个容易解决的问题,虽然……)我明白了,但是,考虑一下情况:(应用表单)((lambda(x)x)1),当然汽车零件(lambda(x)x)是一个过程,但是它返回了所有的类型谓词,包括“程序”、“对”、“列表”?在其参数未绑定的情况下引发错误。因此我认为我们的过程应该具有相同的行为。您是对的,我没有考虑过窗体的
car
本身是复合窗体的情况。好。。。我想哪个解决方案更可取取决于问题的确切陈述。事实上,只使用
(定义申请表?对?
)是有道理的