то есть, ключи - список объектов, а значения - свойства объекта в виде plist. Далее, в программе такой код:
(defun foo (var)
(let* ((var1 (gethash var *h*))
(var2 (getf var1 :a)))
(тут какой-то код)))
(foo 'item1)
то есть, сперва я получаю список свойств item1, а потом из этого списка я хочу получить поле :a. В var1 всё хорошо: там содержится нужный список. а вот в var2 всегда nil. Более того, если выполнить в repl
(getf (gethash 'item1 *h*) :a)
, будет nil. Однако, если выполнить
(gethash 'item1 *h*)
, потом скопировать полученый список в repl, и выполнить (getf скопированный-список :a), то результат будет правильный (то есть a1)
В связи с этим 2 вопроса:
1) как получить нужное значение
2) как правильно хранить и загружать какие-то конфиги. не в json-е же их хранить.
а зачем мне ещё одна сущность, если я могу всё хранить в обычных s-exp, а потом в самой программе делать из этого хэш (для удобства). просто я не могу понять, почему при выполнении gethash всё нормально, а если к результату gethash применить getf, то значения куда-то теряются
я в том смысле, что в файле конфига так и хранится. а в самой программе я этот список преобразовываю в хэш-таблицу. а вот с хэш-таблицей проблемы. (если вместо хэш-таблицы использовать plist, точно такие же проблемы возникают)
Без quote и как можно в более простом формате. Потом прочитать конфиг read-ом и построить хэш-таблицу (возможно, вложенную) одним (и более) loop-ом. Eval при этом не нужен.
(defmacro my-config (name &body body)
`(defparameter ,name ,(тут парсим body и строим хэш-таблицу)))
тогда (load «that-config.lisp») автоматически будет определять переменную *foo* с уже готовой таблицей, так как код прочитается, макрос раскроется, то есть напишет код разбора конфига в таблицу и нужный defparameter потом выполнится.
read и load всё равно, так что на усмотрение программы - lisp, sexp, elc (enterprise lisp config) и т.п. Если в файле просто s-выражение (можно сделать read, но нельзя eval), то, наверно, sexp, если там что-то специфичное - можно выбрать специфичный суффикс (foo.vertex, bar.edge, baz.face, qux.path}, если там вариант с макросом, так что предполагается делать load, то разумно оставить *.lisp.
Разница может быть, если данные которые мы вкладываем в s-выражения нужно валидировать, то есть они по структуре намного проще s-выражений. Ещё если сами конфиги должны выглядеть не как s-выражения, то нужно либо писать свой парсер в s-выражения (возможно, вешать его на reader macros), либо писать парсер напрямую в нужные структуры данных (хэш-таблицы, классы/структуры и т.п.) вообще без задействования s-выражений.
Тогда именно в лиспе (вообще) почти нечего учить - только quote и макросы могут быть в новинку. В CL/Clojure/Racket, конечно, много своих особенностей.
не очень долго. если знаешь другие языки, то сложность только одна - привыкнуть к синтаксису. ну и к CLOS, если хочешь ООП. CLOS намного отличается от привычных реализаций ООП
сколько времени надо, чтоб развернуть свой мозг (читай изучить) в направлении Lisp
Первые три главы Practical Common Lisp. Дальше само пойдет, если есть свои задачи, к которым будешь применять полученные знания.
Не понимаю всеобщей любви к Practical Common Lisp. Я вот на ЛОР-е обчитался дифирабм к этой книге, скачал и начал читать.
Первая глава - мусор. Ну это наверное политика издательства, а не вина автора. (В том смысле, что целая глава тратиться на то, чтобы описать как сделать sudo apt-get install sbcl). Ну ладно, пропустили I главу.
Вторая глава (про REPL)- не мусор, но и ничего дельного не говорит. Т.е. если бы я не был знаком со схемкой, то ничего бы из этой главы не понял, ну просто перепечатал бы примеры. В главе очень много разного материала, но суть вещей не объясняется. Ладно, прочитали II главу, но ничего нового не узнали.
Третья глава - оооофииигенннноооооо! Ну т.е., черт с ней, то что там говорят о том, что якобы делают базу данных, и я на ЛОРе видел анона, который утверждал, что может после чтения 3 глав PCL сделать свою собственную РСУБД, но материала в этой главе ну очень много. Пока ее читал, даже возбудился — думал про себя всего навсего 3-ая глава, а уже столько интересного. Ну и разумеется читать её приходилось так: прочитал страницу — еще час гуглил по встречающим на этой странице вещам. Когда я дочитал 3-ую главу (убил на это выходные!), я подумал ого, что же будет когда дочитаю книгу до конца.
И вдруг такое разочарование: в следующих главах подробно говорится то, о чем была 3-ая глава и то, что я фактически уже нагуглил. На 8-ой главе, мне эта клоунада (ну зачем так ужасно писать книги?) уже порядком надоела и я нафиг выбросил эту книжку.
Я уже думал, что нормальной литературы по CL нету, как всё же решил рискнуть и начал читать «ANSI Common Lisp» — как оказалось, отличная книжка без клоунады с разделамы и без пафоса как в PCL. Материал отлично структурирован в ANSI Common Lisp и в общем всех советую именно эту книжку для введения в CL. Потом уже можно читать такие крышесносящие книжки, как PAIP и AMOP
дай-ка угадаю: ты тот самый анон, который глубоко уверен в том, что «надо запрыгнуть в отрасль обработки больших объемов данных пока не поздно» и при этом, думает что clojure и scala — единственные годные для этого инструменты? даже не знаю в какую палату тебя направить, клоунидзе!
Да видел я Land of Lisp. Понятно, что у книги есть определенный коммерческий успех, но зачем такое инженеру — ума не приложу.
Practical Common Lisp — не клоунада, но многие вещи мне там не понравились, к примеру, структура книги, а чем я уже сказал. Еще всякие бредни вроде «The Story of Mac: A Just-So Story», тоже нафиг можно было бы выкинуть оттуда.
Я лишь говорю, что не понимаю всеобщую мастурбацию именно на эту книгу, когда есть варианты получше: ANSI Common Lisp + On Lisp для введения, потом AMOP, а потом практика-практика-практика.
не нужны. clojure - какой-то извращённый лисп. куча синтаксического сахара, типа квадратных и фигурных скобок. в чём приемущество? якобы кроссплатформенность? да sbcl поддерживает больше архитектур, чем jvm. а по скорости, код, скомпиленный sbcl не медленнее явы (а обычно быстрее). библиотеки? для CL написано не меньше.
а scala - какая-то неудачная попытка сделать нормальный язык для jvm. синтаксис там просто ужасный
Покажи использование CL в продакшене. Для Clojure и Scala есть отдельные страницы с именами крупных компаний, которые используют эти языки. А где CL? И преимущество обоих (не в последнюю очередь) в простом написании многопоточных приложений. И одним из бонусов является наличие огромного количества библиотек и фреймворков для платформы Java.
про использование уже написали. да и корпорации, продающие лисп зп большие деньги наверное раззорились, если бы их продукт не использовался. а они вот живут. ну из самого известного - maxima на CL.
> в простом написании многопоточных приложений
вот тут скалка то и не очень как раз. так что не приемущество. ну а на счёт библиотек, назови не java-специфичную любу, которой нет для CL.