Perché "swindle" è diverso nell'interprete racket rispetto a drracket?
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
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.