Читабельність S-виразів


9

Коротше кажучи, і для тих, хто цього не знав, функції Lisp / оператори / конструкції всі однаково називають так:

(function arg0 arg1 ... argN)

Отже, що на мові, подібній С, ви б виразили як

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

перетворюється на Lisp sexp як

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

. Коли речі стають більш реальними / складнішими, так роблять і для них відповідні s-вирази.

Я усвідомлюю, що це, швидше за все, суб'єктивне питання, але - чи для багатьох хакерів Lisp це маленьке роздратування, з яким завжди доведеться стикатися?

Або хтось рано чи пізно звикає до цього (відсутність) синтаксису?

У будь-якому випадку, чи додавання розривів (які ви не додавали б у свій еквівалент С, у більшості разів) для читабельності є хорошою ідеєю, особливо в довгостроковій перспективі? Будь-які інші пропозиції будуть вітатися.


1
Ви намагалися використовувати Lisp в середовищі, що обізнане з Lisp, наприклад, emacs? Я б не торкнувся цього іншого.
Девід Торнлі

Ні, я ні, в яких формах це може покращити мій досвід Lisp?
vemv

написання коротких функцій також дуже важливо, хоча я лише грав з клоджуром.
Кевін

3
У хорошому середовищі Lisp ви ігноруєте дужки та читаєте структуру за допомогою відступу. Як ви вже помітили, читання структури, підраховуючи дужки, насправді, насправді дратує.
Девід Торнлі

Відповіді:


8

Як ти розбираєшся

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

Дерево розбору, ймовірно, виглядає приблизно так

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

хм ... давайте серіалізуємо це дерево у список, позначення префікса

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

Цим форматом дерева розбору досить легко маніпулювати, але у мене є одна проблема. Я ненавиджу роздільники. Мені подобаються термінатори. У той же час мені подобається бризкати в пробіл.

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

хм ... додатковий пробіл робить певні речі складнішими для розбору ... Можливо, я міг би просто скласти правило про те, що дерево зображене як (лист корінкового листя).

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

Тепер моя серіалізація дерева розбору є lisp (функція перейменування застосувати, і це, ймовірно, працює). Якщо я хочу програми, які пишуть програми, то непогано просто маніпулювати деревами розбору.

Це не зовсім те, як виникли s-вирази, але вони були ідентифіковані рано, і це одна з особливостей, яку використовують програмісти lisp. Наші програми в якомусь сенсі попередньо розібрані, і писати програми для маніпулювання програмами досить просто через формат. Ось чому брак синтаксису іноді вважають силою.

Але, як сказав Девід, використовуйте відомий редактор s-виразів. Ви, швидше за все, втратите трек закриваючої дужки в s-виразі, ніж закриваючу дужку в xml ( </foo>лише закривається <foo>, але правий батьків закриває будь-який s-вираз s). У ракетці використання квадратних дужок для деяких виразів у поєднанні з хорошим стилем відступу усуває більшість проблем.

Версія lisp:

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

Не дуже погано.


Списки є більш універсальними та потужними, ніж exprs + заяви без сумнівів. Спроба Emacs (чи що ще?) Заманливо, але останній раз я спробував це просто мене налякало. Що конкретно приносить усвідомлення сексу?
vemv

Прості речі: вони підкреслюють родзинку на закритих і відкритих паренах (або виділяють цілі s-вирази по-різному). Вони мають хороші правила відступу. У Emacs є і інші речі, але вони, мабуть, не такі важливі для читабельності. Є й інші відомі редактори s-виразів. Вам не потрібні emacs. Якщо emacs вас лякає, спробуйте пакети для textmate, sublime тощо. Як тільки ваш редактор починає допомагати з читабельністю, все стає дещо простішим. Я роблю більшість моторошних речей у ракетці, що дозволяє квадратні дужки в будь-якому місці. Можливість переключення вгору допомагає читати.
ccoakley

1
Вбік скористайтеся вкладеними даними, визначте тощо, розбийте їх на більш дрібні шматки. Якщо ви не можете придумати гарне ім’я для шматка, сприйміть це як попередження про ваш дизайн. Знайдіть баланс між занадто малим на ім’я та занадто великим для читання.
ccoakley

О, ця остання порада ... запам'ятовується :) Пробуючи Піднесене, коли я це пишу.
vemv

5

Що справді приємно в s-exp - це те, що через короткий проміжок часу ви їх більше не бачите, це як пітон для ваших очей, Але комп'ютер все ще має дерево легко.

  • Тож відступ є автоматичним, немає двозначності, вам не потрібно двічі натискати вкладку чи щось подібне, коли ви хочете закінчити блок.

  • Якщо ви вибрали якийсь випадковий код, весь матеріал легко відступить лише однією командою улюбленого редактора

  • Ви можете переміщатися по коду дуже легко, стрибати між втор-ехр, поміняти їх місцями і так далі з хорошим редактором

Плюс тому, що дані, якими ви маніпулюєте, такі ж, як і код, який ви пишете, ви могли використовувати ту саму мову, щоб маніпулювати кодом правильно?

Ну, ви можете це зробити, ось що таке макроси, ви маніпулюєте кодом, який ви пишете, перш ніж він оцінюється як будь-який інший список, тому кажуть, що Lisp - це "програмована мова програмування". Ви пишете код, який пише ваш код для вас.

Ось приємна стаття, яка описує природу Lisp та чому програмісти Lisp посміхнулися, побачивши XML.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.