为什么"和"和"或"不在Scheme中?

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,nornand都没有).

那么,它是一个宏还是什么(可能是为了促进短路)?如果是这样,执行"和"操作的布尔函数是什么?

ama*_*loy 7

其他答案已经解释了如何使用and"好像"它是一个函数,但原因and是宏是支持你习惯于其他语言的"短路"行为.例如,(and #f (display "blah"))不会打印任何内容,因为and一旦看到错误值就会停止.如果and是一个函数,它的两个参数必须在调用之前进行评估,然后display无论如何都会发生.


Dou*_*rie 6

是的,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)

  • Racket调用那些函数`andmap`和`ormap`.(你也可以在`srfi/1`的名字`every`和`any`下得到它们.) (2认同)