我在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)作为一个过程来使用吗?
发布于 2016-07-13 09:13:26
你想要的是
`(1 . ,car)这是准引号构造--简而言之,它只计算car (通常--只计算不带引号的",“表达式),并将它的值插入到不带引号的形式的位置。再举一个小例子:
scheme@(guile-user)> `(quasiquote magic (+ 2 3) => ,(+ 2 3))
$1 = (quasiquote magic (+ 2 3) => 5)您的第一个示例之所以有效,是因为cons是一个过程(即不是特殊形式),因此它的参数在应用程序之前进行计算。第二种方法不起作用,因为你有(1 .car)引用。
还要注意,您的pairA不是一个列表--过程不是用列表表示的,它们是原子:
scheme@(guile-user)> (pair? car)
$1 = #fhttps://stackoverflow.com/questions/38341043
复制相似问题