2011-11-05 9 views
6

Znalazłem to pytanie o funkcji specjalnej „lub” w schemacie:Dlaczego nie mogę zdefiniować "lub-funkcji" w schemacie?

Joe Hacker stwierdza głośno, że nie ma powodu, albo na schemacie musi być specjalny - może to być po prostu zdefiniowane przez programistę, tak:

(define (or x y) 
    (if x 
     #t 
     y)) 

Czy Joe ma rację?

Nie mogę zrozumieć, dlaczego nie powinno to być możliwe.

Czy jakiś ekspert-programista powinien wyjaśnić, czy to działa, a jeśli nie: dlaczego nie?

+1

Nie wiem, jakiej książki używasz do nauki Planu, więc musiałem przejść do [specyfikacji języka Scheme] (http://www.r6rs.org/final/html/r6rs/r6rs-ZH -14.html # node_sec_11.4.5). "Jeśli nie ma żadnych s, zwracane jest #f. W przeciwnym razie wyrażenia są obliczane od lewej do prawej, aż zwróci wartość true (patrz sekcja 5.7) lub osiągnięte zostanie ostatnie . W pierwszym przypadku lub wyrażenie zwraca wartość val bez oceny pozostałych wyrażeń.W tym ostatnim przypadku ostatnie wyrażenie jest obliczane, a jego wartości są zwracane. " Czy funkcja 'lub' Joe'a działa w ten sposób? –

+2

http://www.cs.washington.edu/education/courses/cse341/99wi/scheme/mini-exercises.html –

+1

Nawiasem mówiąc, to * może * być zdefiniowane przez programistę, ale nie jako prosta funkcja. Nie jest specjalne dla niektórych wartości specjalnych. http://www.scheme.com/tspl4/further.html#defn:or – erjiang

Odpowiedz

13

To dlatego, że ta wersja or ocenia wszystkie swoje argumenty (ponieważ jest to funkcja), podczas gdy standardowy schemat or (który nie jest funkcją, ale specjalną składnią) nie. Spróbuj uruchomić (or #t (exit)) na Scheme REPL, a następnie spróbuj tego samego z funkcją or.

Zachowanie standardu or jest czasami nazywane short-circuited: ocenia tylko te argumenty, które musi. Jest to bardzo częste działanie binarnego operatora boolowskiego (or i and) w różnych językach programowania. Fakt, żewygląda jak funkcja wywołania funkcji, jest cechą składni Scheme/Lisp, ale wygląda na oszukiwaną.

+0

To wszystko! Dziękuję za wyjaśnienia, które bardzo pomogły! – Edgar

1

Niezależnie od tego, czy to działa, czy nie zależy od tego, co chcesz zrobić. Z pewnością działa w tym sensie, że dla dwóch podanych wartości boolowskich zwróci oczekiwany rezultat. Nie będzie to jednak funkcjonalny odpowiednik zwykłego or, ponieważ nie powoduje zwarcia, tzn. Biorąc pod uwagę definicję (or #t (/ 0 0)) spowoduje błąd, ponieważ dzielisz 0 na 0 podczas korzystania ze zwykłego or, a następnie zwróci on #t i nie spróbuje ocenić (/ 0 0) w ogóle.

+0

To wszystko, dziękuję! – Edgar

Powiązane problemy