Sle*_*led 2 scheme boolean racket
我map用来测试值列表,看看他们是否有给定的属性.然后,我想看看他们是否都拥有该属性并返回true iff他们都这样做.
所以我的第一个想法就是只and列出列表,(and (list #t #t #f))但似乎将整个(#t #t #f)视为布尔值true并返回它.
所以,我想我可以使用foldl.我知道那些(foldl + 0 (list 1 2 3))我认为(foldl and #t (list #t #t #f))应该也能正常工作的作品......但事实并非如此.
在DrRacket(使用#lang racket)中,我得到错误" and: bad syntax in: and",这不是太有用,但在Repl.it(使用BiWaScheme)上我得到错误" Error: #<Syntax and> is not a function".
所以,我猜这and是一个宏?支持这一看来,如果我只是评价+我得到的#<procedure:+>,但and我得到and: bad syntax in: and(stranglely,xor是一个过程,但是or,nor和nand都没有).
那么,它是一个宏还是什么(可能是为了促进短路)?如果是这样,执行"和"操作的布尔函数是什么?
其他答案已经解释了如何使用and"好像"它是一个函数,但原因and是宏是支持你习惯于其他语言的"短路"行为.例如,(and #f (display "blah"))不会打印任何内容,因为and一旦看到错误值就会停止.如果and是一个函数,它的两个参数必须在调用之前进行评估,然后display无论如何都会发生.
是的,and是一个宏.但你可以把它变成功能
(lambda (x y) (and x y))
Run Code Online (Sandbox Code Playgroud)
如在
(foldl (lambda (x y) (and x y)) #t your-list)
Run Code Online (Sandbox Code Playgroud)