1. Если обязательно нужен _функциональный_ стиль (ты не собираешься всё писать в лоб) - что-то вроде этого (каюсь, дальше определения html не разбирался). Единственное замечание - '(:html (:body (...))) - это список, и для его построения можешь использовать всю мощь лиспа :) В том числе `(:html (:body ,(list :p title)))
2. Если хочешь отказаться от eval - тогда написать свою макро по аналогии с html, которая берёт значение из глобальной переменной (как ты и спрашивал). Но это ужасно криво и я тебе это не советовал :)
3. Подписаться на рассылку lml2 и спросить - как тот-же результат получить функциями (или через параметры/подстановку/как угодно)
> Потом было еще несколько книг, в которых о Лиспе говорилось в превосходной степени. Поэтому, когда у меня появился шанс использовать Лисп в деле, я попробовал (Guile, встраиваемая реализация Scheme). Впечатления - сугубо отрицательные, после месяца упорной грызни кактуса переделал все в Питон, о чем еще ни разу не пожалел.
1. Одного чтения мало. Я не хочу сказать, что полный тормоз, но "на досуге" "врубался" в лисп довольно долго, пока перестал тупить при виде первого попавшегося исходника. Вот потом "засосало". И и менно с тикля/питона/иже с ними.
2. Схема мне мение "по душе", но теперь это уже не имеет значения (с самого начала подкупило то, что CL такой большой :)
3. Ещё раз подтвержу: да, у питона сейчас больше "батареек из корбки"
возможно не непосредственно, а из других языков и наречий. Но в лиспе многое появилось впервые и там же доведено до совершенства.
> Питон это не передирка лиспа
ладно, поправлюсь.
s/некоторых заимствований из лиспа/некоторых ссущностей, которые давно есть в лиспе но либо отсосутствуют в других наречиях либо менее эффективны в них из-за более враждебново им синтаксиса этих наречий
>Мне кажется, что просто отключена проверка типов, и, если на входе
процедуры - значение неправильного типа, на выходе - мусор. Нет?
По идее -- да. Я практически с этой стороной не возился плотно. На
уровне игрушки потыркал -- смотрел, как он с FPU работает и пр.
Однако сейчас проверил кое-что:
* (defun foo (a b)
;; optimized addition procedure; much leaner assembly
(declare (optimize (speed 3) (safety 0) (debug 0)))
(declare (type fixnum a b))
(the fixnum (+ a b)))
FOO
* (foo 3 5)
8
* (foo "d" "f")
#<unknown immediate object, lowtag=#b110, widetag=#xC6 {14FE6CC6}>
*
Ругается. Так что, возможно, если при пользовании функциями
неправильный тип нарисовался, то сообщит что-то.
У меня по этой ссылке открылось начало обсуждения, в котором Die-Hard _не_ говорит о том, что Лисп не нужен :-P
>> "в чем ваша лисповая тайна, лисперы?"
> Видимо всё-таки нужно но сложно переучивацо с алгоритмического стиля мышления на более абстрактный.
Вот-вот, и я о том же. Лисперы достигли такого уровня абстракции, что понятиями мельче "стиль мышления" не оперируют. Может, отсюда и подозрения в шарлатанстве? КОНТРОЛЬНЫЙ СМАЙЛИК: ";)"
>> Лично мне приятно услышать от лиспера, что Питон "ненамного хуже".
>Чесно говоря я таково не утверждал.
Прочтано в твоем посте... Да ладно, оговорка по Фрейду, дело житейское - с кем не бывает ;) Подумаешь, тайный серпентофил - всё нормально, добро пожаловать в клуб 8)
>Тогда это не может компилироваться в одну инструкцию "add" %)
Ну если подумать, то, скорее всего, он ругается на более раннем этапе. Ведь еще же есть цепочка событий, которая идет от REPL. :) Как только я в REPL написал (foo "2" "3"), он пытается засунуть эти вещи в регистры, которые в сложении учавствуют. Видит, что тип не тот (неупаковываемый в понятие fixnum), и раппортует. Я попробовал не REPL, а вызов foo из другой функции. При указании чисел с плавающей точкой SBCL также ругнулся. Так что думаю, ругается он еще до вызова функции, а в самой функции проверок нет, как видишь. Ничего более точного сказать не могу. Этой стороной я плотно не занимался пока.
> А есть интерфейсы Lisp --- .NET, Lisp --- Java, этим пользуются?
чё за тырфейсы? сокеты чёли? сокеты есь. Для взаимодействия с другими наречиями - http://www.cliki.net/compatibility%20layers . Есь Kawa - схема, диалект лиспа, работающяя в JVM. для дотнетиненады - никогда не интересовался. Наверное нету потомушто дотнетиненадо - ЛАЖА а лисперы ЛАЖУ не любют.
> 1. Как вы подcели на лисп?
Читал статью "побеждая посредственнось". На то время умя выдалась на редкось тупая работа, и я, пока увольнялся, решил проверить, действительно ли правда чё там писано, просто со скуки. Ожидал нескко большево, но вобщем-то и так неплохо.
> 2. Какой самый крупный проект вы на нём написали?
Достаточно крупный - никакой. Для своих целей много всякой хни до нескольких сотен строк длиной. Есь задумки для пары проектов, но не уверен чё когданть приступлю к реализации.
> А есть интерфейсы Lisp --- .NET, Lisp --- Java, этим пользуются?
Интерфейсы есть. Кому надо - пользуются. Но таких - меньшинство даже среди лисперов.
> 1. Как вы подcели на лисп?
Да вот маялся между всякими питонами/тиклями/уже не помню чем. Везде что-то не устраивало. Ну и когда задавал вопросы в эхах - как сделать то, как сделать это - периодически посылали: это тебе лисп нужен... :) Поверил :) Вернее - полез знакомится. И чем больше знакомился - тем меньше пользовался всем остальным.
> 2. Какой самый крупный проект вы на нём написали?
In public - никакой :) Те реализации CL, которые меня устраивают по некоторым критериям (мультиплатформенность, ОС) - не устраивают своим "содержанием". Да и многие "батарейки" далеки от рабочего состояния. Приходится принимать участие в доводке всего этого до ума.
P.S. Я не профессиональный программист - это хобби, помогающее по работе :)
> Как насчет проверки типов параметров макроса?
не трабла, хоть одново, хоть половины хоть всех скопом
[1]> (defmacro tst (a b) `(format t "~S ~S~%" (the fixnum ,a) ,b))
TST
[2]> (tst 1 2)
1 2
NIL
[3]> (tst 1 "2")
1 "2"
NIL
[4]> (tst "1" "2")
*** - THE: "1" при вычислении возвратила следующие значения ("1"), не принадлежащие типу FIXNUM
Break 1 [5]>
> но является ли это фишкой _всех_ CL?
не.
> Тут один товарищ рядом почитал этот флейм и сказал: "И какой идиот сказал что язык программирования это точка в идеальном пространстве!" :-)
Не правда!!! Я не упоминал Достоевского. А точкой в идеальном пространстве можно назвать что угодно... А можно еще оболочки и срезы начать рассматривать. Worse is Better!
как ты представляеш себе макрос с переменными? их же значение может быть неопределено на момент компиляции ну ваще. Макросы код на лиспе генерят есличё...
ХЗ. Я вообще Лисп плохо знаю. Твоими руками я пытаюсь решить такую задачу: обернуть некую функцию в макрос, который выдавал бы ошибку (на этапе трансляции!), если аргумент функции имеет не тот тип. Понятно, что аргумент может быть как аргументом, так и литералом. Можно ли такое сделать?
> Твоими руками я пытаюсь решить такую задачу: обернуть некую функцию в макрос, который выдавал бы ошибку (на этапе трансляции!), если аргумент функции имеет не тот тип.
Ох уж эта динамическая типизация... Статическая типизация и ocaml рулят.
> Понятно, что аргумент может быть как аргументом, так и литералом.
Во время выполнения макры некоторую обработку параметров можно вести, но, как правило, это касается только значений или списков. С литералами хуже: текущее пространство имен и т.п. Не видел. Попробуйте... :)
Кстати о статической типизации, недавно нашёл один интересный лисп: http://lush.sourceforge.net/. В нём есть офигенно эффективный компилятор для статически типизированного кода. Если быть точным, генерируется код на C, и код получается обычно такой же, как я бы руками написал. Ну и что меня вообще добило, в программу на лиспе можно запросто делать вставки на С. :) Кто там хотел лисп с ассемблерными вставками? Да лехко! :D
> Исхожу из того, что ASDF установлен вместе с SBCL. Если у тебя
> Gentoo или Debian, то просто установи common-lisp-controller. ASDF
> вместе с ним поставится.
У меня Gentoo. common-lisp-controller был установлен по зависимостям sbcl.
$ emerge --search cffi
Searching...
[ Results for search key : cffi ]
[ Applications found : 1 ]
* dev-lisp/cl-cffi
Latest version available: 0.9.1
Latest version installed: 0.9.1
Size of files: 144 kB
Homepage: http://common-lisp.net/project/cffi/
Description: The Common Foreign Function Interface (CFFI)
License: BSD
Пойдет? Для верности, сделал и так, как ты сказал.
$ sbcl
This is SBCL 0.9.17, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>;.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (asdf:operate 'asdf:load-op 'lambda-gtk-examples)
; loading system definition from
; /usr/share/common-lisp/systems/lambda-gtk-examples.asd into #<PACKAGE "ASDF0">
; registering #<SYSTEM LAMBDA-GTK {1002695F91}> as LAMBDA-GTK
debugger invoked on a SIMPLE-TYPE-ERROR: Argument Y is not a REAL: NIL
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(defun foo (a b) (declare (optimize (speed 3) (safety 0) (debug 0))) (declare (type fixnum a b)) (+ a b))
(defmacro bar (x y) `(foo ,x ,y))
(format t "~D~%" (bar "a" "b"))
потомушто сначяло макром сгенерицо код а потом код будет компилицо если типы, передаваемых в функцию не совпадут, будет ругацо, без разницы, функция вызвата из другой функции или из макра. Ты про такое спрашивал?