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 ★★★ ()
Ответ на: комментарий от KivApple

Emacs + slime же.

Для редактирования скобочек ещё могу paredit посоветовать поставить.

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

Я пробовал писать так и в итоге чуть не свихнулся

man paredit-mode

man paren-mode

Oxdeadbeef ★★★ ()
Ответ на: комментарий от 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 ★★★★★ ()
Ответ на: комментарий от Oxdeadbeef

Всё ок. Сам свалил с кложуры на Racket. Общелисп у меня у самого только в процессе освоения. И да, Emacs рулит, остальное закопать.

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

Сам свалил с кложуры на Racket.

Историю успеха в студию?

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

Почитай абсолютно любую книгу по CL, там правильно расставлено. Practical Common Lisp рекомендую.

Gentooshnik ★★ ()

ТС, делай функции покороче, и let не станут лапшой.

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

В смысле разбивать большую функцию на подфункции?

KivApple ★★★★★ ()

А между тем никто так и не ответил на вопрос про производительность...

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

Сам свалил с кложуры на Racket.

лолнахера? головой ударился?

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

А между тем никто так и не ответил на вопрос про производительность...

а ты профайлил?

anonymous ()

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

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

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

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

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

Да, и ещё делать let где попало, конечно, можно, в отличие от не-лиспов, но не стоит.

(defun sum (x y) (+ x y))

Почему бы не использовать просто функцию «+»?

Gentooshnik ★★ ()

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

И последняя

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

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

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

anonymous ()

Обращаю внимание на функцию LIST*. (list* abc xyz) Делает примерно то же, что (nconc (list abc) xyz).

Gentooshnik ★★ ()

моя первая программа на JS


infixToPrefix = (s) => {
   var op = s[0]
   s = s.slice(1).trim()
   return eval(s.replace(/ /g, op))
}

Все нахваливают...

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

Это было просто для теста, что нормально работает вызов функций.

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

Успеха? Скорее неуспеха. Кложа жрёт как не в себя. Жабий бэкенд о себе даёт знать.

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

я чот не заметил чтобы кожура позиционировалась как встраеиваемый язык для платформ с ограниченными ресурсами

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

На кложе кроме вебговен сильно и нечего писать. Она годная, но jvm всё портит, а clr реализация почти не развивается. Racket более песпективен.

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

ваще-то самый юзабельный. палю: юзабельность напрямую кореллирует с количеством нужных библиотек.

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

Это LOR, так что не сливайся, а отвечай за свои слова.

Norgat ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.