Đây là conditionalsyntactic form hoặc có thể được triển khai dưới dạng macro mở rộng đến một số core syntax form, được trình biên dịch/thông dịch coi là trường hợp đặc biệt.
The list there in Racket's docs bao gồm if
dưới dạng biểu mẫu đặc biệt nhưng không bao gồm and
, vì vậy có thể được thực hiện dưới dạng cũ nhất. Nhưng R5RS does list and
as a syntactic keyword. Vì vậy, tốt nhất chúng ta có thể nói, đó là một cú pháp đặc biệt hoặc macro.
Thật dễ dàng để viết lại bất kỳ biểu mẫu and
(and a b c ...)
dưới dạng một mẫu if
, (if a (if b (if C#t #f) #f) #f)
.
lambda
là tốt bởi tôi, nhưng bạn cũng có thể sử dụng every
from SRFI-1 (hoặc Racket's andmap
):
(every identity '(#t #f))
should return #f
.
chỉnh sửa: ngoại trừ, as Joshua Taylor points out, gọi lambda
thông qua chức năng như foldl
không ngắn mạch. Mà đánh bại mục đích để gọi and
ở nơi đầu tiên.
Một điều khác là, trong Racket's foldl
đối số cuối cùng đối với lambda
là đối số nhận kết quả trước đó trong chuỗi ứng dụng; vì thế việc thực hiện thực sự nên
(foldl (lambda (a b) (and b a)) #t '(#t #f))
Nguồn
2013-07-29 08:47:51
Bạn luôn có thể tô điểm nó với srfi-26 (cắt) – jozefg
@jozefg bạn có nghĩa là '(foldl (cắt và <><>) #t '(#t #F)) '? Nhưng [SRFI-26] (http://docs.racket-lang.org/srfi-std/srfi-26.html?q=cut#cut) cũng nói rằng '(cắt nếu <> 0 1)' là bất hợp pháp bởi vì 'if' không phải là" một biểu thức trong ý nghĩa của R5RS "- mà dường như làm cho' và' bất hợp pháp cũng ở đó. –
@WillNess Nó kiểm tra tốt cho tôi với vợt 5.3. Cho dù điều này có thực hiện cụ thể hay không, tôi không chắc chắn – jozefg