2012-02-02 14 views
5

Mi chiedo chi può spiegare la logica del design dietro le seguenti caratteristiche di autolisp/visual lisp? Per me sembrano volare di fronte alla pratica del software accettato ... mi manca qualcosa?Qualcuno può spiegare le decisioni di progettazione di Autolisp/visual lisp a me?

  • Tutte le variabili sono globali di default (cioè a meno che non posto dopo un / negli argomenti della funzione)
  • dati di lettura/scrittura da AutoCAD richiede di mettere roba in una lista di associazione con un sacco di numeri di magia. 10 significa coordinate x/y, 90 significa lunghezza dell'elenco delle coordinate, 63 significa colore, ecc. Ok, potresti memorizzarli in alcune costanti ma ciò significherebbe ancora più globali, e la documentazione ti incoraggia a usare direttamente i numeri magici.
  • Lisp è un linguaggio in stile funzionale, che incoraggia la programmazione mediante ricorsione rispetto all'iterazione, ma la ricorsione della coda è afaik non ottimizzata in visual lisp che porta a pile di chiamate orrende - a meno che, naturalmente, non si iterazioni. Ma la sintassi del loop è molto restrittiva; per esempio. non è possibile interrompere o restituire un valore da un ciclo a meno che non si inserisca un qualche tipo di flag nella condizione di terminazione. Risultato, brutto codice.
  • Generalmente si è costretti a dichiarare variabili in tutto il luogo che vola di fronte alla programmazione funzionale, quindi perché utilizzare un linguaggio funzionale (-ish)?

risposta

6

Lisp non è una lingua, è un group of sometimes surprisingly different languages. Scheme e Clojure sono i membri funzionali della famiglia. Common Lisp, e le razze più specializzate come Elisp non è particolarmente funzionale e non incoraggia intrinsecamente la programmazione funzionale o la ricorsione infatti include uno very flexible object system, uno extremely flexible iteration DSL e non garantisce chiamate tail ottimali (i dialetti di schema funzionano, ma non i Lisps in generale; questo è il trabocchetto nel pensare a "Lisp" come una singola lingua).

Ora che abbiamo chiarito, AutoLisp è un'implementazione dal 1986 basata su una versione precedente di XLISP (la più antica delle quali è stata pubblicata in 1983).

La ragione per cui potrebbe volare di fronte alle pratiche di programmazione attualmente accettate è che è precedente alla pratica di programmazione attualmente accettata.. Un'altra cosa da tenere a mente è che il netbook più economico oggi disponibile è il several hundred times più potente di quello che un programmatore potrebbe aspettarsi di avere accesso a metà degli anni '80. Il che significa che anche se una determinata funzione è stata accettata come eccellente, i vincoli della CPU o della memoria potrebbero aver impedito la sua implementazione in un linguaggio commerciale.

Non ho mai programmato specificamente in Autolisp/Visual Lisp, e le cose che citate suonano fastidiose, ma potrebbe aver avuto qualche vantaggio in termini di prestazioni/memoria che lo giustificasse in quel momento.

+0

"potrebbe aver avuto un po '" ... nah ", loro" solo "hanno preso" così com'è stato, senza il permesso dell'autore presumibilmente, e non si sono mai presi la briga di migliorarlo per paura di incompatibilità arretrata. –

+0

@Will - Man. Immagino che lo spieghi allora; l'originale XLISP era un progetto giocattolo per lo scrittore, non qualcosa che stava promuovendo seriamente. – Inaimathi

+0

Le date dal 1983 al 1986 non sono precedenti all'eccellenza del Lisp, mi spiace. Nel 1986, Common Lisp era già lì e quasi la stessa cosa che è stata standardizzata nel 1994. Non è un caso di predare, ma un caso di non avere la minima idea. AutoLisp era peggiore di alcuni Lisps negli anni '60. – Kaz

3

Se non ricordo male, AutoLisp è una forcella da una prima versione di XLISP (alcune fonti sostengono che fosse XLISP 1.0 (vedi this C2 article).

XLISP 1.0 è un lisp 1-cell (funzioni e variabili condividono lo stesso nome-spazio) con alcune stranezze piuttosto strano ad esso.

2

È possibile aggiungere dynamic scoping nel mix btw e se non si sa cosa si consideri fortunato.Ma in realtà non tutti i quattro punti sono che grande di un affare IMO:

  • "Vars sommerso sono creati automaticamente come globale". Come in CL non lo è (via setq)? L'altra opzione è fallire, e non è molto attraente per il linguaggio che dovrebbe essere usato per lo scripting rapido-sporco.

  • "numeri magici" sono codici DXF, che hai ragione sono maggiori inconvenienti in quanto tendono a cambiare con le versioni ACAD che cambiano a volte (per fortuna, raramente). È proprio così. Fissarlo richiederebbe una revisione completa, introducendo alcuni "schemi" e cosa no, e perché dovrebbero "loro" preoccuparsi? AutoLISP fu lasciato nel suo stato approssimativamente del 1992 approssimativamente, e non si preoccupò più da allora. Lo stesso Visual LISP è completamente diverso e molto più capace, ma è tutto bloccato per l'utente normale, e fatto solo per servire un obiettivo - per emulare il vecchio AutoLISP nel modo più fedele possibile (eccetto dove ha aggiunto nuove funzionalità correlate a VBA nella seconda metà degli anni '90, e fu bloccato da allora).

  • (while (not done) ...) non è quello brutto. Non c'è garanzia di ottimizzazione della coda, sì, proprio come non ce n'è uno in CL e Haskell (l'ultimo mi inciampa davvero - non esiste un modo sicuro per codificare un loop in Haskell nello spazio costante senza monade - che ne dici di questo?).

  • "sei costretto a dichiarare vars dappertutto" qui non ti seguo. Dichiarate che dovevate dichiararli - nella lista degli argomenti interni della funzione. Quali altri posti intendi? Non ne conosco

In realtà il più grande ostacolo di AutoLISP è la sua risoluzione del nome dinamica IMO, ma è così che è stato nel XLISP, solo pochi anni dopo Schema uscito prima. Quindi è anche il suo archivio dati immutabile, ma ciò è stato fatto principalmente per semplicità di implementazione, e per evitare troppa confusione e quindi domande, dalla base di utenti, credo.

+1

In realtà, Haskell supporta le chiamate tail (a patto che si utilizzi un'applicazione di funzione rigorosa per impostare l'accumulatore). Ero confuso su questo punto io e [questa risposta] (http://stackoverflow.com/a/4286283/190887) chiarito. – Inaimathi

Problemi correlati