成对存储过程 (Scheme/Guile)

Storing Procedure in a Pair (Scheme/Guile)

我在Guile工作,需要使用成对存储的过程。如果我在以下示例中存储 car

(define pairA (cons 1 car))
(define pairB '(1 . car))

..我只能从第一个表达式计算过程。第二个变成了一个符号,我猜是因为它成对而不是列表:

>(display pairA)
(1 . #<primitive-procedure car>)

>(display pairB)
(1 . car)

为什么第一个例子return是car程序,而第二个不是?我能说的唯一区别是 pairA 都是 list/pair,而 pairB 只是一对。有什么方法可以将 (cdr pairB) 用作程序吗?

你要的是

`(1 . ,car)

这是 quasiquote 结构——简而言之,它只计算 car(一般来说——只计算不带引号的“,”表达式),并将它的值插入到不带引号形式的位置。再举一个小例子:

scheme@(guile-user)> `(quasiquote magic (+ 2 3) => ,(+ 2 3))
 = (quasiquote magic (+ 2 3) => 5)

您的第一个示例之所以有效,是因为 cons 是一个过程(即不是特殊形式),所以它的参数在应用之前进行评估。第二个没有用,因为你引用了 (1 . car)。

另请注意,您的 pairA 不是列表——过程不表示为列表,它们是原子:

scheme@(guile-user)> (pair? car)
 = #f