S-ekspresi keterbacaan

9

Singkatnya dan bagi mereka yang tidak mengetahuinya, fungsi / operator / konstruksi Lisp semuanya seragam disebut seperti ini:

(function arg0 arg1 ... argN)

Jadi apa yang dalam bahasa seperti-C yang akan Anda ungkapkan

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

ditransformasikan menjadi sejenis kelamin Lisp

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

. Ketika segala sesuatunya menjadi lebih nyata / rumit, begitu pula ekspresi s yang sesuai, untuk saya.

Saya sadar bahwa ini kemungkinan besar merupakan pertanyaan subyektif, tetapi - apakah bagi banyak peretas Lisp ini gangguan kecil yang harus selalu dihadapi?

Atau apakah orang terbiasa dengan sintaksis ini (cepat atau lambat)?

Dalam kasus apa pun, apakah menambahkan terobosan (bahwa Anda tidak akan menambahkan setara C Anda, paling sering) untuk keterbacaan ide yang baik, terutama dalam jangka panjang? Saran lain akan diterima.

vemv
sumber
1
Sudahkah Anda mencoba menggunakan Lisp di lingkungan Lisp-aware seperti emacs? Saya tidak akan menyentuhnya dengan cara lain.
David Thornley
Tidak, belum, dalam bentuk apa itu bisa meningkatkan pengalaman Lisp saya?
vemv
menulis fungsi pendek juga sangat penting, meskipun saya hanya melakukan beberapa bermain dengan clojure.
Kevin
3
Dalam lingkungan Lisp yang baik, Anda mengabaikan tanda kurung dan membaca struktur dengan indentasi. Seperti yang Anda perhatikan, membaca struktur dengan menghitung tanda kurung benar-benar menjengkelkan.
David Thornley

Jawaban:

8

Bagaimana Anda menguraikan

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

Pohon parse mungkin terlihat seperti itu

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

hmm ... mari membuat serial pohon ini menjadi daftar, notasi awalan

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

Format pohon parse ini cukup mudah untuk dimanipulasi, tapi saya punya satu masalah. Saya benci pemisah. Saya suka terminator. Pada saat yang sama, saya suka menaburkan di ruang putih.

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

hmm ... spasi putih tambahan membuat hal-hal tertentu lebih sulit diurai ... Mungkin saya bisa membuat aturan bahwa pohon itu direpresentasikan sebagai (daun akar daun daun).

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

Sekarang serialisasi pohon parse saya adalah lisp (ganti nama fungsi untuk diterapkan, dan ini mungkin berjalan). Jika saya ingin program yang menulis program, senang rasanya memanipulasi pohon parse.

Ini tidak sepenuhnya bagaimana s-ekspresi muncul, tetapi itu diidentifikasi awal, dan itu adalah salah satu fitur yang digunakan programmer cadel. Program kami sudah dipra-parsing dalam beberapa hal, dan menulis program untuk memanipulasi program cukup mudah karena formatnya. Itu sebabnya kurangnya sintaksis terkadang dianggap sebagai kekuatan.

Tetapi seperti yang dikatakan David, gunakan editor penyadaran ekspresi-s. Anda lebih cenderung kehilangan jejak kurung kurawal dalam ekspresi-s daripada kurung kurawal dalam xml ( </foo>hanya tutup <foo>, tetapi paren kanan menutup APAPUN ekspresi-APAPUN). Dalam raket, penggunaan tanda kurung siku untuk beberapa ekspresi, ditambah dengan gaya indentasi yang baik, memperbaiki sebagian besar masalah.

Versi lisp:

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

Lumayan.

ccoakley
sumber
Daftar lebih fleksibel dan kuat daripada pernyataan exprs + tidak diragukan lagi. Mencoba Emacs (atau apa lagi?) Menggoda, tetapi kali terakhir saya mencobanya sangat membuat saya takut. Apa yang dibawa oleh kesadaran sexp?
vemv
Hal-hal sederhana: mereka memantulkan sorotan pada parens dekat dan terbuka (atau menyorot seluruh ekspresi-s secara berbeda). Mereka memiliki aturan indentasi yang bagus. Emacs memiliki hal-hal lain, tetapi mereka mungkin tidak sepenting untuk keterbacaan. Ada editor sadar ekspresi-s lainnya. Anda tidak perlu emacs. Jika emacs membuat Anda takut, coba bundel untuk teman teks, luhur, dll. Setelah editor Anda mulai membantu keterbacaan, segalanya menjadi sedikit lebih mudah. Saya melakukan banyak hal lispy di raket, yang memungkinkan tanda kurung di mana saja parens dapat digunakan. Mampu beralih membantu keterbacaan.
ccoakley
1
Sebagai tambahan, manfaatkan nested mari, mendefinisikan, dll. Memecah barang-barang itu menjadi potongan-potongan kecil. Jika Anda tidak bisa mendapatkan nama yang bagus untuk sebuah chunk, anggap itu sebagai peringatan tentang desain Anda. Temukan keseimbangan antara terlalu kecil untuk disebutkan dan terlalu besar untuk dibaca.
ccoakley
Oh saran terakhir itu adalah ... mudah diingat :) Mencoba Luhur saat saya menulis ini.
vemv
5

Apa yang benar-benar baik tentang s-exp adalah bahwa setelah waktu yang singkat, Anda tidak melihatnya lagi, itu seperti python di mata Anda TETAPI komputer masih memiliki pohon itu dengan mudah.

  • Jadi indentasi otomatis, tidak ada ambiguitas, Anda tidak perlu menekan tab dua kali atau sesuatu seperti itu ketika Anda ingin mengakhiri blok.

  • Jika Anda memilih beberapa kode acak, semuanya mudah di-indentasi dengan hanya satu perintah dari editor favorit Anda

  • Anda dapat menavigasi kode Anda dengan sangat mudah, melompat antara s-exp, menukar mereka dan sebagainya dengan editor yang baik

Plus, karena data yang Anda manipulasi sama dengan kode yang Anda tulis, Anda bisa menggunakan bahasa yang sama untuk memanipulasi kode Anda, kan?

Nah, Anda bisa melakukannya, itulah makro, Anda memanipulasi kode yang Anda tulis sebelum dievaluasi seperti daftar lainnya, itu sebabnya dikatakan bahwa Lisp adalah "Bahasa Pemrograman yang Dapat Diprogram". Anda menulis kode yang menulis kode untuk Anda.

Berikut adalah artikel bagus yang menggambarkan sifat Lisp dan mengapa programmer Lisp menyeringai ketika mereka melihat XML.

Daimrod
sumber