在一对中存储过程(Scheme / Guile)

时间:2016-07-13 00:55:41

标签: functional-programming scheme guile

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

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

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

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

>(display pairB)
(1 . car)

为什么第一个示例将car作为过程返回,而不是第二个?我能说的唯一区别是pairA既是列表/对,也是pairB只是一对。有没有办法使用(cdr pairB)作为程序?

1 个答案:

答案 0 :(得分:1)

你想要的是

`(1 . ,car)

这是quasiquote结构 - 简而言之,它只评估汽车(通常只评估未加引号的“,”表达式),并将其值插入不带引号的形式。还有一个小例子:

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

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

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

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