Leggibilità delle espressioni S


9

In breve e per coloro che non lo sapevano, le funzioni / operatori / costrutti di Lisp sono tutti chiamati in modo uniforme in questo modo:

(function arg0 arg1 ... argN)

Che cosa esprimeresti in un linguaggio di tipo C

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

si trasforma in un sexp Lisp come

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

. Man mano che 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 di Lisp questo piccolo fastidio che dovremo sempre affrontare?

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

In ogni caso, l'aggiunta di linee di discontinuità (che non aggiungerei nel tuo equivalente C, la maggior parte delle volte) per la leggibilità è una buona idea, soprattutto a lungo termine? Qualsiasi altro suggerimento sarebbe il benvenuto.


1
Hai provato a usare Lisp in un ambiente compatibile con Lisp come emacs? Non lo toccherei in nessun altro modo.
David Thornley,

No, in quali forme può migliorare la mia esperienza con Lisp?
Vemv,

anche scrivere brevi funzioni è molto importante, anche se ho solo giocato un po 'con il clojure.
Kevin,

3
In un buon ambiente Lisp, si ignorano le parentesi e si legge la struttura per rientro. Come hai notato, leggere la struttura contando le parentesi è davvero, davvero fastidioso.
David Thornley,

Risposte:


8

Come si analizza

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

L'albero di analisi probabilmente sembra qualcosa del genere

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, notazione con prefisso

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

Questo formato dell'albero di analisi è abbastanza facile da manipolare, ma ho un problema. Odio i separatori. Mi piacciono i terminatori. Allo stesso tempo, mi piace spruzzare negli spazi bianchi.

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

hmm ... lo spazio bianco aggiuntivo rende alcune cose più difficili da analizzare ... Forse potrei solo fare una regola che l'albero è rappresentato come (foglia foglia foglia radice).

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

Ora la mia serializzazione di un albero di analisi è lisp (rinomina la funzione da applicare, e questo probabilmente funziona). Se voglio programmi che scrivano programmi, è un po 'bello manipolare solo alberi di analisi.

Questo non è interamente il modo in cui sono nate le espressioni s, ma è stato identificato in anticipo, ed è una caratteristica che usano i programmatori lisp. 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 consapevole di s-expression. È più probabile che tu perda traccia di una parentesi graffa di chiusura in un'espressione s rispetto a una parentesi graffa di chiusura in xml ( </foo>chiude solo <foo>, ma la parentesi destra chiude QUALSIASI espressione di s). Nella racchetta, l'uso di parentesi quadre per alcune espressioni, combinato con un buon stile di rientro, risolve la maggior parte dei problemi.

La versione lisp:

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

Non male.


Le liste sono più versatili e potenti delle dichiarazioni exprs + senza dubbio. Cercare Emacs (o cos'altro?) È allettante, ma l'ultima volta che l'ho provato mi ha spaventato molto. Cosa porta esattamente la consapevolezza del sexp?
Vemv,

Roba semplice: rimbalzano un punto culminante su parentesi chiuse e aperte (o evidenziano intere espressioni s in modo diverso). Hanno delle buone regole di rientro. Emacs ha altre cose, ma probabilmente non sono così importanti per la leggibilità. Esistono altri editor consapevoli di s-expression. Non hai bisogno di emacs. Se emacs ti spaventa, prova i bundle per textmate, sublime, ecc. Una volta che l'editor inizia ad aiutare con la leggibilità, le cose diventano un po 'più facili. Faccio la maggior parte delle cose morbide nella racchetta, che consente parentesi quadre ovunque si possano usare i parens. Essere in grado di cambiare aiuta la leggibilità.
ccoakley,

1
Per inciso, fai uso di annidati let, definisce, ecc. Suddividi quella roba in pezzi più piccoli. Se non riesci a trovare un buon nome per un pezzo, trattalo come un avvertimento sul tuo design. Trova l'equilibrio tra troppo piccolo per nome e troppo grande per leggere.
ccoakley,

Oh, l'ultimo consiglio è ... memorabile :) Sto provando Sublime mentre scrivo questo.
Vemv,

5

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

  • Quindi il rientro è automatico, non c'è ambiguità, non è necessario premere due volte la linguetta o qualcosa del genere quando si desidera terminare un blocco.

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

  • Puoi navigare nel tuo codice davvero facilmente, passare da s-exp, scambiarli e così via con un buon editor

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

Bene, puoi farlo, ecco cosa sono le macro, manipoli il codice che stai scrivendo prima che venga valutato come qualsiasi altro elenco, ecco perché si dice che Lisp sia un "linguaggio di programmazione programmabile". Scrivi il codice che scrive il tuo codice per te.

Ecco un bell'articolo che descrive la natura di Lisp e perché i programmatori di Lisp sorrisero quando vedono XML.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.