Сбж. Постепенно уйдет, или все-же станет более распространенным? Пугает http://www.tiobe.com/tpci.htm (выберите LISP и увидете спад). Хотя почему? Язык функциональный, динамически типизованный, сейчас такие вещи в моде...
>Что значит "красивый с математической точки зрения"?
Может, не совсем корректный термин, но смысл такой: Scheme придумана не левой пяткой; за ней стоит достаточно изящная модель вычислений. В итоге получился мощный мультипарадигменный язык, построенный на минимальном наборе базовых понятий. Чем и красив.
Для примера, чтобы было ясней: элементарная структура данных (пара) может быть введена в язык как производное (через замыкания), а не базовое понятие. На базе пары оказывается возможным построить сколь угодно сложные структуры данных (списки, ассоциативные списки, деревья, графы...)
Пытаемся проделать что-то похожее в С и осознаем всю его убогость :)
ты довольно глупое существо, как видно. я прошу ПРОСТЕНЬКИЙ dls -- маленький, влезающий на максимум 2-3 страницы. неужели так сложно? или это не сложно, а невозможно? :)
> Вот все вопят про эти DSL-и и про то, что на лиспе их как два пальца об асфальт реализовать. И никто никогда не приводил ни одного примера. Покажите, короче, пример :)
Ты маленькое грязное лживое верещливое чудовище. Выдави себе все твои оставшиеся глаза, ты ими всё равно не пользуешся. Только глазницы глубоко не ковыряй, дабы бескрайние просторы бесконечной пустоты, которые откроются там, могут с лёгкостью поглотить всё сущее.
> Using Lisp to Generate .NET Business Applications
> There has been a lot of buzz generated from Martin Fowler's recent DSL article, "Language Workbenches: The Killer-App for Domain Specific Languages?". Actually, in contrast with his other articles, this one is actually interesting.
> The lisp advocates were quick to respond, including creating this video blog(from Rainer Joswig) that provides a lisp specific approach to Martin Fowler's example DSL.
Т.е. там нету ни втроенных шаблонов, ни перегрузки, ни даже классов. Соответственно нету и встроенной проверки компилятора пригодности нововведений, код становится запутанным, с разным синтаксисом у каждого "автора", не понятным окружающим и т.д.. Я правильно понял перл про классы без лишних сущностей в ядре языка? На любом языке можно легко написать непонятно, но на этом поделии сделать обратное оказывается на порядок сложнее, это и есть повод для гордости?
> С++ - самый лучший и универсальный язык, он лучше быстрее и надёжнее жавы, выразительнее обычного с, безопаснее и удобнее пыха, руби и питона, а lisp - rip. Разве что с++ для скриптов не подойдет.
Дадад! С++ -- это прогрессивно, надежно и глобально!
> Вот все вопят про эти DSL-и и про то, что на лиспе их как два пальца об асфальт реализовать. И никто никогда не приводил ни одного примера. Покажите, короче, пример :)
Если вкратце, то на тех 42 страницах примеры реализации cl-sql (встраивание SQL прямо в код Лиспа), простой язык управляющего протокола, язык построения узкоспециализированных парсеров (нечто вроде мета-lex/yacc). Ну и еще дофига всего.
> а вот интересно узнать "продолжение". удалось ли внедрить лисп? или он не подошел? Вобщем, как дальнейшие отношения с лиспом сложились?
А вот дальше в самом деле получилась небольшая фигня. А именно, в clex оказалось, что отсутствуют состояния. Сходу я их добавить не смог, связался с автором. Он сказал, что доделать несложно, но ему некогда.
А потом тема вообще слегка замерзла. Тем более, что у меня уже был большой объем кода на Эйфеле, и просто жаба задушила его выбрасывать. Хотя на самом деле на Лиспе бы получилось намного лучше -- в нем можно было бы описывать конфигурации форматтера в лоб (до этого предполагалось использовать некий вариант XML), прямо кодом.
В общем, я уже сказал -- вот выйду на пенсию... :-)
> В с++ есть классы, которые могут вводить любое понятие, а не только списки и деревья.
В CL классы реализованы, как частный случай списков и деревьев, что тоже позволяет выводить любое понятие, но в реальной жизни CLOS практически не нужно использовать. Достаточно списков и деревьев.
Как сделать, чтобы в лиспе (Common Lisp и/или Scheme) интерпретатор не ругался на неизвестные (необъявленные функции), а молча их игнорировал или вызывал какую-нибудь дефолтную функцию, не прекращая работы программы?
Зачем нужно. Просто пришла в голову идея приспособить лисп для прямой работы с rtf.
> Т.е. там нету ни втроенных шаблонов, ни перегрузки, ни даже классов.
Да там ничего нет :) Но это ничего нечто, а не ничто. По сути лисп - это чистое абстрактное синтаксическое дерево с минимумом особых форм, вроде cond. Чем и силён, потому что позволяет реализовать, как я понял, ВСЁ.
Если честно, я жалею что раньше в институте и школе не изучал лисп. Сейчас мне это сделать сложнее и основная проблема - это не знание языка, а умение пользоваться сложными математическими абстракциями.
Почитай sicp, там с первых же страниц идут примеры, заставляющие восхититься изящностью языка, вроде:
Упражнение 1.4
a + abs(b)
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b)
- всего-лишь маленький пример приема, который на C++ нельзя применить или надо очень много накрутить.
b > 0 ? a + b : a - b
действительно много..
Ещё как вариант, считая, что функции plus и minus описаны
(b > 0 ? plus : minus)(a, b)
практически один в один.
> Смысл же не в вычислении a + abs(b), а в способе. Здесь сишный пример не катит.
Не буду спорить, я SICP всё никак не прочитаю, но в реальной жизни я подобные примеры нахожу редко. Вот чего мне не хватает - МУЛЬТИМЕТОДЫ. Я лисп бы использовал только за это :) На каждом шагу двойная диспетчеризация нужна, и приходится либо архитектуру переделывать, либо городить визитор. Почему её никто не чешется реализовать, это же киллер-фича.
> Это уже более похоже на лисповский пример, но чувствуешь в чём отличие?
В том, что этот код неестественен для C? Возможно.
> интерпретатор не ругался на неизвестные (необъявленные функции), а молча их игнорировал или вызывал какую-нибудь дефолтную функцию, не прекращая работы программы?
> В том, что этот код неестественен для C? Возможно.
Не только. Во первых, повезло что в Си есть тернарный оператор :), во вторых синтаксис всё-равно получился неестественный, а главное смысл: в лиспе (схеме) оператор + или - вычисляется как результат функции, а в Си в обоих случаях, в сущности, просто ветвление.
> перед вызовом таковых поюзать boundp и functionp?
Так я же зараннее не знаю известна функция или нет? Честно говоря, я еще не очень освоил подобные манипуляции, но смысл у меня был в том, чтобы после минимальной синтаксической переделки сделать из RTF файла программу на лиспе, каковую и исполнить.
По стандарту RTF неизвестные RTF-операторы должны игнорироваться.