我在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)
作为程序?
答案 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