首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scheme中使用"and“

在Scheme中使用"and“
EN

Stack Overflow用户
提问于 2010-07-08 01:47:50
回答 2查看 1.5K关注 0票数 0

嘿,我正试着在cond语句中使用and。基本上,在运行一些代码之前,我不是简单地检查<exp1>是否为真,而是需要Scheme来检查<exp1><exp2>是否为真。我知道(and #t #f)的计算结果是#f,而(and (= 10 (* 2 5)) #t)的计算结果是#t。遗憾的是,方案不会接受

代码语言:javascript
复制
(and (eqv? (length x) 1) (eqv? (car x) #t))

其中x是一个列表,它的第一个元素是一个S表达式,计算结果为#t#f (实际上,我只想执行(and (eqv? (length x) 1) (car x)),但这不起作用)。

谁能解释一下我做错了什么,或者如何改正?顺便说一句,有人知道...在方案中的含义吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-07-08 05:40:24

“其中x是一个列表,它的第一个元素是一个计算结果为#t或#f的S表达式(实际上,我只想这样做(and (eqv?(length x) 1) (car x)),但这不起作用。”

(car x)的第二种情况下,您只获取列表中的第一个元素,而不计算它。

假设你的列表x是一个列表((eq? 3 3)),我只是说说而已。它的长度是1,如果我们计算它,它的第一个元素的计算结果是#t,但是本例中的(car x)检索一个列表(eq? 3 3),这是一个由一个符号和两个数字组成的列表。

您的问题的解决方案是使用eval,就像在(eval (car x) (null-environment))中一样,它计算一个数据,比如一个列表。

如果您使用的是另一个答案中提到的((car x)),那么只有当您的列表的第一个元素是一个thunk、一个空值时,如果您通过计算列表(list (lambda () #t))来构造x,这才会起作用。

在这种情况下,您的第一个元素将是一个函数,该函数在不带参数的情况下被调用时会生成#t

票数 3
EN

Stack Overflow用户

发布于 2011-02-12 23:34:37

这是有效的(定义l1 '(#t #f #t))

代码语言:javascript
复制
(car l1)
; #t    
(and (car l1) (car (cdr l1)))
; #f

但这不是

代码语言:javascript
复制
(define l2 '((eq? 1 1) (eq? 1 2)))

(car l1)
; '(eq? 1 1)  
(and (car l1) (car (cdr l1)))
; fails

你想要做什么?

如果是第二个,那么在可能的情况下,考虑在将表达式输入列表之前计算表达式。

或者你可以试试:

代码语言:javascript
复制
(define l3 (list eq? 1 1))

l3
; '(#<procedure:eq?> 1 1)

(apply (car l3) (cdr l3))
; #t
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3197417

复制
相关文章

相似问题

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