LINUX.ORG.RU

Моя первая программа на Lisp

 ,


2

6

Все везде нахваливают Lisp и я решил тоже потыкать его. Почитал немного документации, а затем написал свою первую программу.

http://pastebin.com/CZ6MTw1S

Это преобразователь из инфиксной в префиксную форму. С учётом скобок и приоритетов операций. А ещё с возможностью вызывать функции помимо выполнения математических операций.

То есть пишем что-то вроде (c-expr ( 2 + 2 * 2 + sin ( 1 ) ) / 2 ), а оно преобразует это в нормальную лисповую форму записи - (/ (+ (+ 2 (* 2 2)) (sin 1)) 2), а такое уже легко вычисляется средствами самого Lisp.

Программа работает вроде как и всегда (пробовал несколько тестов) выдаёт верный результат, но вот вопрос - там огромное количество всяких ветвлений и рекурсий. Насколько я рационально её написал, не будет ли проблем с производительностью (быть может, надо как-то оптимизировать)?

Просто в Lisp не принято писать так, как в обычных языках программирования (да и некоторые конструкции при дословном переводе будут некрасиво смотреться), поэтому и советы по оптимизации от них не годятся. Например, если сохранять в локальные переменные все значения, которые используются дважды (чтобы не считать их 2 раза), то будет дикая лапша из let. Или это не нужно? Или это не лапша (и вообще мой код не лучше), а норма?

★★★★★
Ответ на: комментарий от theNamelessOne

И, кстати, какую IDE посоветуешь, чтобы она правильно отступы делала и автокомплит умела (насколько я понимаю, для Lisp автокомплит достаточно тривиальный нужен)? А то Kwrite не очень для этого удобен.

KivApple ★★★★★ ()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от theNamelessOne

И ты не сходишь с ума от закрываюших скобках на одной строке, когда нужно дописать выражение в не самую вложенную скобку или понять, где ты не закрыл скобку?

Я пробовал писать так и в итоге чуть не свихнулся. Но, возможно, в нормальной IDE, а не Kwrite есть для этого какие-то специальные плюшки, которые всё меняют.

KivApple ★★★★★ ()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от Oxdeadbeef

Посоветуй, что почитать. Если с основами всё более-менее ясно, то с более продвинутыми вещами, например CLOS, совсем не понятно.

Не думал, что когда-нибудь скажу это, но желательно что-нибудь на русском. Просто язык слишком отличается от всего, что я когда-либо знал, и поэтому ресурсов на восприятие ещё и иностранного языка не остаётся (во всяком случае, пока я такой нуб).

KivApple ★★★★★ ()
Ответ на: комментарий от KivApple

Главный паттерн при написании кода на лиспе—код должен расти лесенкой вправо, т.е. заканчиваться кучей закрывающих скобок, и чтоб никакого желания вставить промеж них не было.

staseg ★★★★★ ()
Ответ на: комментарий от KivApple

И ты не сходишь с ума от закрываюших скобках на одной строке, когда нужно дописать выражение в не самую вложенную скобку или понять, где ты не закрыл скобку?

Для этого есть куча пакетов для подсветки скобок, я использую paren.

theNamelessOne ★★★★★ ()
Ответ на: комментарий от KivApple

rainbow-delimiters-mode поставь в Emacs. Хочешь писать на лиспе - осваивай Ёмакс, лучше не придумано до сих пор.
Пример rdm: http://www.oklab.org/2016/05/05/land-of-lisp-setup-emacs-color/01.png
https://ericscrivner.me/wp-content/uploads/2015/06/rainbow-delimiters.png
Вот очень годный пример rdm для кложуры: http://jr0cket.co.uk/slides/images/clojure-dojo-poetry.png

Hertz ★★★★★ ()
Ответ на: комментарий от KivApple

но желательно что-нибудь на русском

не желательно

Почитать можно в таком порядке:

1) PCL (есть на русском)

2) ANSI Common Lisp

3) On Lisp — Advanced Techniques

4) PAIP

5) Object-Oriented Programming In Common Lisp

6) The Art of the Metaobject Protocol

Еще под рукой лучше держать HyperSpec.

Ну и классику почитать: SICP (Scheme)

Oxdeadbeef ★★★ ()
Последнее исправление: Oxdeadbeef (всего исправлений: 1)

Судя по стилю, которым ты исполняешь, тебе лучше начать с Кложуры. +1 к этому аргументу, то, что можно редактор попроще взять, чем Емакс. Lighttable например, или Идею с плагином Cursive Clojure.

Hertz ★★★★★ ()

Или это не лапша (и вообще мой код не лучше), а норма?

this. Но если у тебя один let вложен в другой, скорее всего у тебя есть в функции кот, который нужно вынести в отдельную функцию

anonymous ()
Ответ на: комментарий от Gentooshnik

Самый неюзабельный из более-менее популярных лиспов.

Clojure — отличный детектор лишперов, которые на самом деле нихера не умеют, только делают вид что находятся с илитарной крутой секте

anonymous ()