Leggibilità delle S-espressioni

9

In poche parole e per coloro che non lo sapevano, le funzioni / operatori / costrutti Lisp sono uniformemente definiti in questo modo:

(function arg0 arg1 ... argN)

Quindi cosa in un linguaggio simile a C dovresti esprimere come

if (a > b && foo(param))

viene trasformato in un sexp Lisp come

(if (and (> a b) (foo param)))

. Poiché le cose diventano più reali / complicate, anche le loro corrispondenti espressioni s, per me.

Sono consapevole che questa è probabilmente una domanda soggettiva, ma - per molti hacker Lisp questo è un piccolo fastidio con cui dovresti sempre occuparti?

O ci si abitua principalmente a questa (mancanza di) sintassi prima o poi?

In ogni caso, l'aggiunta di interruzioni (che non si aggiungerebbero all'equivalente C, la maggior parte delle volte) per la leggibilità è una buona idea, specialmente a lungo termine? Qualsiasi altro suggerimento sarebbe benvenuto.

    
posta vemv 09.12.2011 - 21:52
fonte

2 risposte

8

Come si analizza

if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}

L'albero di analisi probabilmente assomiglia a

if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse

hmm ... serializziamo questo albero in un elenco, la notazione del prefisso

if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))

Questo formato di albero di analisi è piuttosto facile da manipolare, ma ho un problema. Odio i separatori. Mi piacciono i terminatori. Allo stesso tempo, mi piace spruzzare in spazi vuoti.

if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))

hmm ... lo spazio bianco supplementare rende più difficile l'analisi di alcune cose ... Forse potrei semplicemente stabilire che l'albero è rappresentato come (foglia foglia di foglia).

(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)

Ora la mia serializzazione di un albero di analisi è lisp (si rinomina la funzione da applicare, e questo probabilmente funziona). Se voglio programmi che scrivono programmi, è piuttosto bello manipolare gli alberi di analisi.

Questo non è esattamente il modo in cui sono state create le espressioni S, ma è stato identificato in anticipo, ed è una delle funzionalità utilizzate dai programmatori. I nostri programmi sono pre-analizzati in un certo senso e scrivere programmi per manipolare i programmi è abbastanza facile a causa del formato. Ecco perché la mancanza di sintassi è talvolta considerata un punto di forza.

Ma come ha detto David, usa un editor che conosca le espressioni S. È più probabile perdere traccia di una parentesi graffa di chiusura in un'espressione s rispetto a una parentesi graffa chiusa in xml ( </foo> chiude solo <foo> , ma il diritto paren chiude QUALSIASI espressione s). In racchetta, l'uso di parentesi quadre per alcune espressioni, insieme a un buon stile di indentazione, risolve molti problemi.

La versione lisp:

(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))

Non male.

    
risposta data 09.12.2011 - 22:43
fonte
5

Ciò che è veramente bello di s-exp è che dopo un breve periodo di tempo, non li vedi più, è come il pitone ai tuoi occhi MA il il computer ha ancora l'albero facilmente.

  • Quindi l'indentazione è automatica, non c'è ambiguità, non ce l'hai per premere scheda due volte o qualcosa del genere quando si desidera terminare a blocco.

  • Se scegli un codice casuale, l'intera roba è facilmente rientrata con un solo comando dal tuo editor preferito

  • Puoi navigare facilmente tra il tuo codice veramente s-exp, scambiali e così via con un buon editor

Inoltre, perché i dati che stai manipolando sono gli stessi del codice stai scrivendo, potresti usare la stessa lingua per manipolare il tuo codice giusto?

Bene, puoi farlo, questo è ciò che sono le macro, puoi manipolare il codice stai scrivendo prima che venga valutato come qualsiasi altro elenco, ecco perché si dice che Lisp è un "linguaggio di programmazione programmabile". tu scrivi il codice che ti scrive il codice.

Qui è un bell'articolo che descrive la natura di Lisp e il motivo per cui i programmatori Lisp hanno sorriso quando vedevano XML.

    
risposta data 10.12.2011 - 01:19
fonte

Leggi altre domande sui tag