成对存储过程 (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
我在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