首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >成对存储过程(Scheme/Guile)

成对存储过程(Scheme/Guile)
EN

Stack Overflow用户
提问于 2016-07-13 08:55:41
回答 1查看 100关注 0票数 0

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

代码语言:javascript
复制
(define pairA (cons 1 car))
(define pairB '(1 . car))

。。我只能从第一个表达式开始计算过程。第二个被转换成一个符号,我猜是因为它是成对的,而不是列表:

代码语言:javascript
复制
>(display pairA)
(1 . #<primitive-procedure car>)

>(display pairB)
(1 . car)

为什么第一个示例将car作为过程返回,而第二个不是?我能区分的唯一区别是pairA既是一个列表/对,而pairB只是一个对。有什么方法可以将(cdr pairB)作为一个过程来使用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-13 09:13:26

你想要的是

代码语言:javascript
复制
`(1 . ,car)

这是准引号构造--简而言之,它只计算car (通常--只计算不带引号的",“表达式),并将它的值插入到不带引号的形式的位置。再举一个小例子:

代码语言:javascript
复制
scheme@(guile-user)> `(quasiquote magic (+ 2 3) => ,(+ 2 3))
$1 = (quasiquote magic (+ 2 3) => 5)

您的第一个示例之所以有效,是因为cons是一个过程(即不是特殊形式),因此它的参数在应用程序之前进行计算。第二种方法不起作用,因为你有(1 .car)引用。

还要注意,您的pairA不是一个列表--过程不是用列表表示的,它们是原子:

代码语言:javascript
复制
scheme@(guile-user)> (pair? car)
$1 = #f
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38341043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档