2015-04-20 13 views
6

Sto cercando (nel mondo reale) gli usi di fexprs, in cui sono utilizzati in modo diverso da quello che può essere realizzato con una valutazione lazy.Esempi di utilizzo non triviale di fexpr

La maggior parte degli esempi che ho potuto trovare utilizzare fexprs solo per implementare la valutazione condizionale, come per un cortocircuito "e" operativo (valutare il primo argomento, se falso, non valutare il secondo e restituire direttamente false).

Sto cercando "utili" usi, cioè dove l'uso di fexpr porta a codice che è "migliore" (più pulito) di quello che potrebbe essere fatto senza fexprs.

+0

Di fexprs, ti riferisci a [macros] (http://en.wikipedia.org/wiki/Macro_ (computer_science) #Lisp_macros) oa effettivi [fexprs] (http://en.wikipedia.org/ wiki/Fexpr)? Sto chiedendo poiché la stragrande maggioranza dei moderni Lisp usa macro invece di fexprs. – malisper

+1

FEXPR è morto nel mainstream Lisp negli anni '80 e sostituito da macro. Le macro servono per astrarre la sintassi. Con la valutazione lazy tutte le forme speciali possono essere funzioni, quindi è possibile implementare la sintassi con le funzioni poiché la valutazione non avviene finché non si ha bisogno di qualcosa calcolato. Di solito queste sono lingue diverse, quindi non riesco a vedere come i due devono essere confrontati quando non si incontrano mai in una lingua. – Sylwester

+0

@malisper Sì, mi riferisco ai fexprs effettivi o "call-by-text" se lo si desidera. –

risposta

2

Esistono due motivi principali per cui si desidera utilizzare fexprs.

Il primo è perché consentono di valutare gli argomenti un numero arbitrario di volte. Ciò rende possibile implementare operatori che valutano i loro argomenti pigramente come suggerito. I costrutti costruiti in questo modo sono anche in grado di valutare i loro argomenti più di una volta. Ciò rende possibile implementare i loop tramite fexprs!

L'altro caso è per la trasformazione. Trasformare il codice è fondamentalmente un modo di scrivere un compilatore sopra il tuo Lisp esistente. Sebbene utilizzi macro e non fexprs, cl-who è un ottimo esempio del tipo di trasformazioni che è possibile effettuare.

1

Fexpr sono in qualche modo ortogonali alla valutazione pigra/desiderosa.

Il solito approccio di funzione è di valutare gli argomenti di una funzione e quindi di chiamarla sul risultato. L'eval pigro si comporta ancora così, ritarda la valutazione solo immediatamente prima che il parametro venga usato.

Il solito approccio macro consiste nel passare gli argomenti non valutati in un modello che valuta tutto ciò che non è quotato. Il pezzo risultante di AST viene iniettato nel sito di chiamata dove viene di solito valutato di nuovo. Questo funziona allo stesso modo con eval pigro.

L'approccio fexpr storicamente folle consiste nel passare argomenti non valutati alla funzione, che fa ciò che piace a loro. Il risultato viene iniettato direttamente nel sito di chiamata e di solito non viene valutato automaticamente.

Il fexpr è abbastanza vicino a una trasformata arbitraria. Quindi puoi implementare macro e lambda con loro. Puoi anche implementare qualsiasi ibrido di valutazione desideroso/pigro che desideri. Allo stesso modo è possibile implementare eval (default) pigro predefinito di fexpr e chiamate esplicite a eval() in vari punti per forzare il comportamento desideroso.

Non penso che caratterizzerei fexpr come una soluzione semplice per implementare l'eval lazy sebbene, in una cura sia peggio del senso della malattia.