Jest to conditionalsyntactic form lub może być zaimplementowany jako makro, które rozszerza się do około core syntax form, co jest traktowane przez kompilator/interpreter jako specjalny przypadek.
The list there in Racket's docs obejmuje if
jako specjalny formularz, ale nie obejmuje and
, więc ten drugi najprawdopodobniej jest zaimplementowany pod względem tego pierwszego. Ale R5RS does list and
as a syntactic keyword. Najlepiej możemy powiedzieć, że jest to albo specjalna składnia, albo makro.
Łatwo jest ponownie napisać dowolny formularz and
(and a b c ...)
jako formularz if
, (if a (if b (if C#t #f) #f) #f)
.
lambda
jest w porządku przez mnie, ale można też użyć every
from SRFI-1 (lub Racket's andmap
):
(every identity '(#t #f))
should return #f
.
edit: wyjątkiem, as Joshua Taylor points out, dzwoniąc do lambda
poprzez funkcję jak foldl
nie zwierać. Który pokonuje cel, aby zadzwonić na and
w pierwszej kolejności.
Inną rzeczą jest to, w Racket's foldl
ostatni argument lambda
jest ten, który odbiera poprzedni wynik w łańcuchu wniosków; więc realizacja powinna być naprawdę
(foldl (lambda (a b) (and b a)) #t '(#t #f))
Zawsze można upiększać go z Srfl-26 (cięcia) – jozefg
@jozefg znaczy '(foldl (cięte i <><> #ti)„(#ti #F)) '? Ale [SRFI-26] (http://docs.racket-lang.org/srfi-std/srfi-26.html?q=cut#cut) również mówi, że '(cut if <> 0 1)' jest nielegalne ponieważ 'if' nie jest" wyrażeniem w znaczeniu R5RS "- co mogłoby sprawić, że" i "będzie również nielegalne. –
@WillNess Testuje dla mnie dobrze z rakietą 5.3. Niezależnie od tego, czy jest to konkretna implementacja, czy nie, nie jestem pewna. – jozefg