2013-03-19 9 views
6

Mówiąc krótko: Moje pytanie brzmi: jaki jest typ zdefiniowanego wyrażenia na Schemacie?Typ Definiuj wyrażenie na Schemacie

Weźmy na przykład:

(define x 5) 

lub

(define x (lambda (n) (* n n))) 

To trochę mylące dla mnie. Czy ktoś może pomóc?

+0

Co masz na myśli przez jego typ? 'define' nie ma wartości zwracanej (a zatem nie ma typu zwracanego), ponieważ nie jest wyrażeniem. – sepp2k

+0

define faktycznie jest wyrażeniem. Teraz, dla twojego drugiego pytania: co mam na myśli przez typ? Cóż, można powiedzieć, że "5 ma typ Numeru", "#f ma typ Boolean", "(lambda (n) (* n n))" ma typ [Numer -> Numer]. Moje pytanie brzmi: jaki jest typ zdefiniowanego wyrażenia? Mam nadzieję, że wyraziłem się jasno. – TheEmeritus

+0

Nie w Rakiecie to nie jest. Jeśli spróbujesz użyć go w kontekście wyrażenia, Racket wyświetli komunikat o błędzie "define: not allowed in context context". – sepp2k

Odpowiedz

11

W Racket define jest specjalną formą, a nie wyrazem, więc nie ma wartości per-se, jeśli starają się wykonać coś takiego dostaniesz błąd:

(display (define x 42)) 
=> define: not allowed in an expression context in: (define x 42) 

gdyby to było mieć wartość byłoby coś podobnego do void, ale to będzie zależeć od konkretnych szczegółów implementacji interpretera (wierzę widziałem jeden powrót interpretera #t po define została zakończona)

The constant #<void> is returned by most forms and procedures that have a side-effect and no useful result

The specification nie zagłębia się w szczegóły tego punktu, albo - wzmacniając stwierdzenie, że jest zależne od implementacji.

+1

'define' nie jest wyrażeniem w Racket. Jeśli użyjesz go w kontekście wyrażenia, pojawi się błąd - nie "# void". – sepp2k

+0

ok, wyjaśnię, że –

+0

Jeśli piszesz tylko "zdefiniuj", to może nie być wyrażeniem, jak to określiłeś. Ale pisanie "(define x 5)" lub cokolwiek innego tego rodzaju jest wyrażeniem w 100%. – TheEmeritus