henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2013-02-02 03:51 pm
Entry tags:

Вечер с илиспом был скучен, ггг. 100 лет на нем ничего не �

Вечер с илиспом был скучен, ггг. 100 лет на нем ничего не писал, все забыл и этап хаоса не проходит.

Эмуляция комон лиспа в имаксе кривая и с очень небрежными примерами.  Героическая борьба со скоупом, отсутствие неймспейсов и клиникой апвард контрол флоу быстро надоедает. Некоторые моменты раздражают особенно, как с иксплисит return, который якобы поддерживается в defun*.

Это не работает:

ELISP> (require 'cl)
cl
ELISP> (defun* foo(x)
(return 42)
x)
foo
ELISP> (foo 1)
* Eval error *  No catch for tag: -cl-block-nil-, 42

Нужно специально создавать блок:

ELISP> (defun foo(x)
(block nil
  (return 42)
  x))
foo
ELISP> (foo 2)
42

Впрочем, к этой мелочи можно привыкнуть. Взбесила меня примитивная (file-name-directory), которая, по идее, должна повторять шеловскую dirname. Можно насладиться:

ELISP> (file-name-directory (file-name-directory "/foo/bar/"))
"/foo/bar/"

ггг. Я ожидал '/'. Даже такую ерунду приходится делать самому.

ELISP> (defun dirname (d)
(directory-file-name (file-name-directory (directory-file-name d)))
)
dirname
ELISP> (dirname (dirname "/foo/bar/"))
"/"

Работает? Вот тогда имаксовская классика (причину которой я вижу в отсутствии культуры tdd и озабоченность rms Важными Проблемами как бойкот SodaStream):

ELISP> (dirname (dirname " /foo/bar/"))
" "

Уже не говоря, что будет, если передать (о ужас) nil.

И такое там все. Бесконечные 70тые.

Случайно нашел в гоогле гоогловский стайл гайд по комон лиспу. (Нахрена в гоогле комон лисп?) и не нашелся как реагировать на:

'You should favor iteration over recursion.
[...]
For compatibility with all compilers and optimization settings, and to avoid stack overflow when debugging, you should prefer iteration or the built in mapping functions to relying on proper tail calls.'

2013 год, зима.

Permalink: https://plus.google.com/115290581164606462017/posts/9Kou5pCBi5p