Questa sembra una semplice domanda; forse è così semplice che è difficile trovare una ricerca che trovi la risposta. In Scheme (in particolare, l'implementazione di Guile se questo fa alcuna differenza) come valuto qualcosa che è stato citato?valutazione di controllo in schema (guile)
Ecco cosa sto cercando di fare.
In pratica ho bisogno di garantire che una funzione che definisco ottenga i suoi argomenti valutati in un ordine specifico, perché gli effetti collaterali causati dalla valutazione di un argomento dipendono durante la valutazione di altri argomenti. Tuttavia, Scheme dice che gli argomenti possono essere valutati in qualsiasi ordine, quindi voglio forzarli manualmente citando gli argomenti e quindi valutarli manualmente nell'ordine che è necessario.
Sembra che "eval" è suppone a fare quello che voglio, ma ha due problemi:
- Il suo uso è sconsigliato, quindi mi sento come ci dovrebbe essere un modo migliore per realizzare ciò che Voglio fare qui.
- In Schema sembra che eval abbia un secondo parametro che è l'ambiente. Questo mi confonde. Voglio che venga valutata nello stesso ambiente in cui appare la frase, quindi perché dovrei aver bisogno di un secondo parametro? È possibile? Ho giocato con eval un po 'e sembra che alcune implementazioni richiedano parametri diversi (es. Mit-scheme non sa nemmeno cosa sia (interazione-ambiente) !!!
Ho provato altri trucchi , come la costruzione di una lambda:
(list 'lambda '() '(car (b c)))
ma sembra che questo debba essere valutato per generare una procedura. Ho anche provato:
(list lambda '() '(car (b c)))
ma questo restituisce un "primitivo-builtin-macro" che non funziona neanche.
Edit: Sembra una macro lavorerà per ordine di valutazione di controllo: (defmacro test1 (ab) `(inizio, B, A))
Come funziona la macro se ho bisogno di un numero variabile di argomenti? '(defmacro test1 (a. b) \' (begin, b, a)) 'non funziona perché b è ora una lista. Ho bisogno di unire in qualche modo all'inizio, ma vari tentativi come '\' (begin (if (pair?, B) (test1, b)), a)) 'non funzionano. – Michael
inoltre, non posso usare '(defmacro test1 (a. B) \' (begin (applica begin, b), a)) 'perché non posso applicare una macro. – Michael
quello che ti sei perso è '(defmacro test1 (a. B) \' (begin, (cons 'begin b), a)) ' –