Perché "swindle" è diverso nell'interprete racket rispetto a drracket?

Sep 03 2020

Qualcuno può spiegare la differenza tra l'utilizzo di drracket con swindle (qualsiasi versione) e l'attivazione dell'interprete come: racket -I swindle

Molte espressioni valutano allo stesso modo in entrambi gli ambienti, ma altre no. Per esempio:

(let-syntax ((let* (syntax-rules() ((let* ab) "You used let*")))) (let* 3 4))

... restituisce "Hai usato let*" in ogni linguaggio basato su schemi che ho provato in drracket. Tuttavia, non riesce nell'interprete sollevato da "racket -I truffa" sulla riga di comando con l'errore

; readline-input:1:20: regole di sintassi: identificatore non legato; ; inoltre, nessun trasformatore di sintassi #%app è vincolato nella fase del trasformatore; in: regole di sintassi ; in: (regole-sintassi() ((let* ab) "Hai usato let*")) ; [,bt per contesto]

Risposte

1 RyanCulpepper Sep 03 2020 at 05:59

Il tuo esempio utilizza syntax-rulesalla fase 1 (ovvero la "fase per la sintassi", nota anche come "fase del trasformatore"), ma sembra che il swindlemodulo (a differenza di racket/basee racket) non fornisca alcun collegamento per la sintassi. (Sembra che swindleutilizzi una vecchia tecnica per fornire collegamenti di fase 1 che funzionino per i moduli scritti nella swindlelingua ma non per un REPL iniziato con racket -l swindle.)

Una soluzione alternativa è valutare

(require (for-syntax racket/base))

prima di valutare il tuo esempio, e poi il tuo esempio dovrebbe funzionare come ti aspetti.