вторник, 4 ноября 2014 г.

Правильная клавиатура для лисперов


Впервые лисп я увидел на производственной практике в университете.

Мне тогда пришлось много работать с AutoCAD. Генерировать из внешних программ заготовки в него, и извлекать данные из AutoCAD наружу.

Пользователи автокада, слегка отличаются от пользователей, ну например, 1с.
Вполне себе привычные к инженерным калькуляторам, обратной польской нотации и лиспам.
Написать что то типа:

(defun C:OFF2 (/ d obj ent adoc *error* undo lays Flag)
  (defun *error* (msg)(vla-EndUndoMark adoc))
  (vl-load-com)(setq adoc (vla-get-activedocument (vlax-get-acad-object))
  lays (vla-get-layers adoc))(vla-StartUndoMark adoc)(setvar "CMDECHO" 0)
  (if (null *OFF2*)(setq *OFF2* (abs (getvar "OFFSETDIST"))))
  (if (zerop *OFF2*)(setq *OFF2* 1))(setq d (getvar "UNDOCTL"))
  (cond ((= d 0) (vl-cmdf "_.UNDO" "_All"))... и ещё пять страниц такого
дабы сэкономить себе таким простеньким макросом мышиную возню по холсту - дело обычное.

Но для моих, не обремененных лиспом мозгов, это было страшное дело.
И я (слабак) сбежал тогда в vba for autocad с доступом через com-объекты, а затем и в c# .net + com interop.

И все эти годы про лисп примерно так и вспоминал, что :
а) нужна особая клавиатура со скобочками
б) мой ssh ключ куда понятнее чем средняя программа на лиспе.

Но, внезапно для себя, одновременно с курсом Programming Languages докатился до Racket, и уже не вижу в этом:
(define natural
  (letrec ([f (λ(x) (cons x (λ() (f (+ x 1)))))])
  (λ() (f 1) ) ) )
ничего отвратительного.

Видимо, гораздо больше повидал уже, попривык.

(После js и ноды собственно что угодно будет выглядеть привлекательно)

Но и сами концепции языка, новые для меня примеры использования тех же thunks - довольно забавно.

Уверен, во многом заслуга преподавателя, Dan Grossman отлично построил этот курс: ни повторов, ни скуки, никаких примитивных концепций.
 
Меня увлекают и лекции и упражнения. Определенно советую.