Equivalente orientato agli oggetti della funzione progn di LISP?

1

Attualmente sto scrivendo un parser LISP che itera attraverso un codice AutoLISP e fa del suo meglio per renderlo un po 'più facile da leggere (cambiando la notazione del prefisso alla notazione infix, cambiando assegnazioni setq a "=" assegnazioni, ecc.) per quelli che non sono abituati al codice LISP / hanno solo imparato la programmazione orientata agli oggetti.

Durante la scrittura dei comandi che LISP usa per aggiungere a una "libreria" di comandi LISP, mi sono imbattuto nel comando LISP "progn". L'unico problema è che sembra che progn stia semplicemente eseguendo il codice in un ordine specifico ea volte (non di solito) assegnando l'ultimo valore a una variabile.

Sono errato assumendo che per la traduzione del progn alla comprensione orientata agli oggetti io possa semplicemente rinunciare alla funzione progn e stampare le affermazioni che essa contiene? In caso contrario, quale sarebbe un buon equivalente per progn in un linguaggio orientato agli oggetti?

    
posta Archibald 05.06.2014 - 20:41
fonte

1 risposta

4

Tutto in Lisp è un'espressione, il che significa che restituisce un valore. La funzione progn esegue una serie di funzioni / moduli, ignorando i valori di ritorno di tutti tranne l'ultima chiamata / modulo, che restituisce come valore di ritorno.

es. nel seguente codice

(progn
  (some-method 'a 'b 'c)
  (another-method 1 2 3)
  (final-method "x" "y" "z"))

il valore restituito dalla chiamata a final-method sarebbe il valore restituito dalla chiamata progn che racchiude.

Un equivalente OOP sarebbe:

public FinalReturnType prognImpl123()
{
    someMethod(Sym("a"), Sym("b"), Sym("c"));
    anotherMethod(1, 2, 3);
    return finalMethod("x", "y", "z");
}

Poiché progn s che incontri verosimilmente essere annidato in altre espressioni, vorrai che le tue traduzioni restituiscano qualcosa.

    
risposta data 05.06.2014 - 22:00
fonte