2013-07-29 20 views
5

Dla następującego kodu:Jak przekazać `i` jako funkcję w grze?

(foldl and #t '(#t #f)) 

rakieta wraca:

and: bad syntax in: and 

wiem and nie jest funkcją. I mogę obejść ten problem używając lambda:

(foldl (lambda (a b) (and a b)) #t '(#t #f)) 

Mam 2 pytania tutaj:

  1. and nie jest funkcją. Więc co to jest? Czy to makro?

  2. Moje rozwiązanie używając lambda wydaje się brzydki. Czy istnieje lepszy sposób na rozwiązanie tego problemu?

Dziękuję.

+0

Zawsze można upiększać go z Srfl-26 (cięcia) – jozefg

+1

@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. –

+0

@WillNess Testuje dla mnie dobrze z rakietą 5.3. Niezależnie od tego, czy jest to konkretna implementacja, czy nie, nie jestem pewna. – jozefg

Odpowiedz

7

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 foldlostatni 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)) 
Powiązane problemy