嘿,我正试着在cond语句中使用and。基本上,在运行一些代码之前,我不是简单地检查<exp1>是否为真,而是需要Scheme来检查<exp1>和<exp2>是否为真。我知道(and #t #f)的计算结果是#f,而(and (= 10 (* 2 5)) #t)的计算结果是#t。遗憾的是,方案不会接受
(and (eqv? (length x) 1) (eqv? (car x) #t))其中x是一个列表,它的第一个元素是一个S表达式,计算结果为#t或#f (实际上,我只想执行(and (eqv? (length x) 1) (car x)),但这不起作用)。
谁能解释一下我做错了什么,或者如何改正?顺便说一句,有人知道...在方案中的含义吗?谢谢!
发布于 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。
发布于 2011-02-12 23:34:37
这是有效的(定义l1 '(#t #f #t))
(car l1)
; #t
(and (car l1) (car (cdr l1)))
; #f但这不是
(define l2 '((eq? 1 1) (eq? 1 2)))
(car l1)
; '(eq? 1 1)
(and (car l1) (car (cdr l1)))
; fails你想要做什么?
如果是第二个,那么在可能的情况下,考虑在将表达式输入列表之前计算表达式。
或者你可以试试:
(define l3 (list eq? 1 1))
l3
; '(#<procedure:eq?> 1 1)
(apply (car l3) (cdr l3))
; #thttps://stackoverflow.com/questions/3197417
复制相似问题