2009-11-05 7 views
12

Jak wyjaśnia artykuł Wikipedia, begin w schemacie jest formularzem biblioteki, który można przepisać przy użyciu bardziej podstawowych formularzy, takich jak lambda.Jak możesz przepisać "rozpocznij" w Scheme?

Ale jak przepisać begin, szczególnie biorąc pod uwagę następujące?

x 
===> error: undefined identifier: x 
(begin (define x 28) x) 
===> 28 
x 
===> 28 

Odpowiedz

18

Nie można. Rzecz w tym, że begin ma dwie role: jedna to sekwencja wyrażeń pobocznych, a druga to, że jest używana do "łączenia" wyników makr. Fakt, że można użyć definicji begin z powyższą definicją, jest rezultatem tej drugiej funkcji i nie można jej samemu napisać.

Jeśli naprawdę chcesz śledzić całą historię, to mógłby określić begin jako prostego makra, które sprawia, że ​​nie tylko aspekt sekwencjonowania (i może rzeczywiście być realizowane jako takie, choć zazwyczaj nie jest) . Ale, musisz dodać jawne rozpoznawanie begin s do definicji splicingu (toplevel lub wewnętrznego). Oznacza to, że implementacja makra jest w porządku, ale tak naprawdę nie może to być biblioteka, ponieważ rdzeń ekspandera powinien o tym wiedzieć. (A ponieważ język ma zasięg leksykalny, nie ma dobrej metody, aby rdzeń ekspandera zidentyfikował begin s, które nie są zdefiniowane w języku podstawowym.)

Podsumowując wszystko, można powiedzieć, że R5RS jest tylko błędny w klasyfikacji begin jako "składni biblioteki", ponieważ nie można jej zdefiniować w bibliotece ... ale nawet to nie jest do końca dokładne, ponieważ R5RS definiuje "składnię biblioteki" jako tylko "wyrażenia pochodne". Prawdziwym błędnym punktem jest zatem to, że jedna z dwóch twarzy begin jest zaimplementowana w innym miejscu, w ekspanderze (dla kontekstów definicji).

Należy również zauważyć, że R6RS wyjaśnia całą transakcję: dwie twarze begin są wyraźne, a teraz jest częścią języka podstawowego, a nie "formą biblioteki", a nawet formą pochodną.

+0

Dlaczego jest on uważany za "składnię biblioteki", a nie po prostu "składnię" w R5RS? Myślałem, że możesz przepisać formularze biblioteczne tylko za pomocą podstawowych formularzy? – eljenso

+2

To pomyłka (razem z artykułem wikipedii). –

+0

[potrzebne źródło] – Javier

2

Nadal można spróbować napisać wersję początku, która spełnia swoją pierwszą rolę: sekwencjonowanie.

(define-syntax sequencing 
    (syntax-rules() 
    [(_ expression) expression] 
    [(_ expression expressions ...) 
    ((lambda (ignored) (sequencing expressions ...)) expression)])) 

Oto post, z którego zrobiłem ten fragment. Zapewnia lepszy kontekst, jeśli jesteś interested, i możesz być.