Здравствуйте, eao197, Вы писали:
AVK>>Можно. Только вот одна засада — жутко неудобно. Привести пример xsd, или на слово поверишь, что будет на порядок лаконичнее?
E>Андрей, если не сложно, приведи -- мне интересно.
Не сложно. Правда на таком примитивном примере не все будет видно.
Здравствуйте, fionbio, Вы писали:
F>Верю, XSD себе представляю. Но. Во-первых, если проверку в Лиспе сделать F>отдельно, она будет, понятное дело, короче.
Мне пофигу — короче она или длиннее. По символам xsd может и не сильно меньше будет. Дело в другом. Приведенный тобой код поддерживать — это застрелиться просто. XS поддерживать несравнимо проще, просто потому что намного проще структура.
F>голову (особенно это касается 1.0). В третьих, никто, блин, не мешает на входе F>получать XML — его ж можно отпарсить в одну строчку через pxmlutils в sexpr, F>а потом перевести в удобоваримый вид с практически нулевыми трудозатратами.
Вот только смысл в лиспе тогда совсем небольшой получается.
1. Приведённые функции осуществляют не только валидацию,
но и генерацию дерева. Проверки осуществляются несколькими
assert'ами (генерирующими исключения при ошибке). Это,
может быть, несколько quick-and-dirty по сравнению
с отдельной схемой вроде XSD, но для целей этого примера
вполне достаточно.
2. Эти ассерты всё-таки едва ли намного длиннее XSD схемы,
хотя у неё есть плюс — декларативность. Но, в конце концов,
никто не мешает на крайняк использовать в качестве источника
XML, у которого можно валидировать схему. Да и на Лиспе
если уж так надо схемовый валидатор сделать совсем не трудно.
3. XSL шаблоны неудобны для генерации кода. Текстовые темплейты
(самопальные или с исп. готовой либы) в Лиспе использовать удобнее.
Здесь же вообще рассматривается подход без текстовых шаблонов,
с использованием AST.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, fionbio, Вы писали:
F>>Верю, XSD себе представляю. Но. Во-первых, если проверку в Лиспе сделать F>>отдельно, она будет, понятное дело, короче.
AVK>Мне пофигу — короче она или длиннее. По символам xsd может и не сильно меньше будет. Дело в другом. AVK>Приведенный тобой код поддерживать — это застрелиться просто. AVK>XS поддерживать несравнимо проще, просто потому что намного проще структура.
Этот код — генератор, а не валидатор (исправленные функции оригинала)!!!
Валидацию я сделал по ходу дела. Любой нормальный лиспер в этом коде разберётся
без проблем за 0,5 секунды. И поддерживать — никаких проблем.
F>>голову (особенно это касается 1.0). В третьих, никто, блин, не мешает на входе F>>получать XML — его ж можно отпарсить в одну строчку через pxmlutils в sexpr, F>>а потом перевести в удобоваримый вид с практически нулевыми трудозатратами.
AVK>Вот только смысл в лиспе тогда совсем небольшой получается.
Генерация, блин. Оно лучше гораздо, чем XSLT, поверьте. Удобоваримее и проще.
Здравствуйте, fionbio, Вы писали:
F>Этот код — генератор, а не валидатор (исправленные функции оригинала)!!! F>Валидацию я сделал по ходу дела. Любой нормальный лиспер в этом коде разберётся F>без проблем за 0,5 секунды. И поддерживать — никаких проблем.
Не, ты мне покажи валидацию. Это важно. А если валидация совмещена с генерацией, то это еще хуже.
F>Генерация, блин. Оно лучше гораздо, чем XSLT, поверьте. Удобоваримее и проще.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, cranky, Вы писали:
AVK>>>Здорово, но я вобще то в лиспе не особо разбираюсь. Можно комментарии где и что и каким образом?
C>>Вот:
AVK>Ну понятно, опять императивный код. Я же говорил о другом — о декларативном задании схемы. Например как в сообщении Re[7]: AST-based solution
Здравствуйте, cranky, Вы писали:
AVK>>Ну понятно, опять императивный код. Я же говорил о другом — о декларативном задании схемы. Например как в сообщении Re[7]: AST-based solution
AVK>Вопрос — насколько тщательно контролируется структура того, что ты привел?
Из objects выбираются только те элементы, в которых первый символ — object. Если в object нет :name будет ошибка, также если в property не будет :type или :name будет ошибка. Для генерации property выбираются только те элементы object, которые в которых первый символ :property
CP>>Вроде практически аналогично XML.
Да есть на эту тему большое обсуждение на c2.com — XML vs. Lisp :
AVK>Только двоеточия какие то странные.
CP>>Вот реализация:
CP>>
CP>>
AVK>Мда, сурово. Я, если честно, ожидал поменьше.
Ну это же без каких-либо библиотек, и вообще весьма прямолянейное решение, здесь нужен более общий подход, как у fionbio.
AVK>P.S. Большая просьба — лишнее цитирование из ответа выкидывать.
Здравствуйте, fionbio, Вы писали:
F>[ Эх, обогнали меня Вчера накалякал пример, хоть и башка F>была весь день какая-то мутная — странно, не пил вроде. Запостить F>вчера моральных сил не хватило ]
F>Попробую привести решение в духе Лиспа F>.....
Очень интересно было почитать и потестить код. Буду читать доку. В этих двух тредах я столько полезных ссылок нашёл, сам бы я на них ещё неизвестно когда вышел...
Забавно, что решение на Руби оказалось короче Лисповского и при этом использует формат описанный в постановке задачи. Хотя тому есть простое объяснение. Использовалась библиотека и язык запростов — XPath. Без них было бы куда длинее.
Интересно было бы глянуть на полное решение на Лиспе. Кстати, на Окамле тоже.
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, cranky, Вы писали:
AVK>>>Ну понятно, опять императивный код. Я же говорил о другом — о декларативном задании схемы. Например как в сообщении Re[7]: AST-based solution
Здравствуйте, fionbio, Вы писали:
F>Чтобы не возникло путаницы.
F>3. XSL шаблоны неудобны для генерации кода. Текстовые темплейты F>(самопальные или с исп. готовой либы) в Лиспе использовать удобнее. F>Здесь же вообще рассматривается подход без текстовых шаблонов, F>с использованием AST.
Во, я как раз работаю над template-based кодогенератором (для UML 2.0) и заинтересовался функциональными языками. Проблема в том, что мне надо взаимодействовать с кодом на С++. Вопрос, есть ли возможность вызова external функций на С++ из Лисп-программы (или программы на ином ФЯ) ? Если нет, то есть ли возможность вызывать просто внешний тул из лисп-программы ? (Т.е. нужен аналог С-шной функции system() или т.п.)
И еще, например Tcl-интерпретатор можно встроить в программу на С/С++, а можно ли подобное сделать с каким либо ФЯ ?
Здравствуйте, Cyberax, Вы писали:
C>aka50 wrote:
>> VD>А зачем тогда Lisp? XSLT и конечное решение в две строчки пишется. >> Но лисп то появился до XSLT . Почему ж изобрели лисапед вместо того, >> чтобы лисп или ту же схему >> подлатать? .
C>А можно парсер Лиспа в 12 килобайт кода?
Не знаю, как у остальных, а у меня оно живёт вот тут:
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\Samples\clisp\
C "железным кодом" все понятно. По-моему это вообще очень мало пересекающиеся задачи — заставить железку работать и формализовать предметную область. К сожалению термин "программирование" только один. Первое меня, как и большинство людей, считающих себя программистами не интересует.
Все же мне кажется можно поискать компромисс. Между созданием своей операционки с Лиспом в качестве системного языка, и разработкой своих версий встроенного Лиспа при создании больших приложений. Лучше всего писать на привычном языке, а для вещей, которые более естественно реализуются на Лиспе иметь небольшой движок Лиспа. У меня есть интепретатор Марка Адлера, но боюсь он в чем-то урезан, и хотелось бы к нему заодно иметь и основные Лисп-библиотеки, и желательно по возможности переделанные в С, чтоб работали побыстрее. А сам движок можно оставить интерпретатором. Вот таким я бы пользовался.
Еще вот мысль. Для Лиспа не было попыток сделать типа стилей, как в Word. Чтобы для символа можно было определить как в редакторе форматировать его ветви. Чтобы полностью в 2D, а не одними шрифтами и цветом — таблицы как таблицы, деревья как деревья. Такой бы конструктор получился.
Здравствуйте, CrazyPit, Вы писали:
AVK>>Вопрос — насколько тщательно контролируется структура того, что ты привел?
CP>Из objects выбираются только те элементы, в которых первый символ — object.
А мне нужно, чтобы если там было что то, начинающееся не с object, то была бы ошибка, причем с сообщением, понятным пользователю. Наконец, правила, по которым определяется корректность, должны быть декларативными.
CP> Если в object нет :name будет ошибка, также если в property не будет :type или :name будет ошибка.
Какая?
CP>>>Вроде практически аналогично XML. CP>Да есть на эту тему большое обсуждение на c2.com — XML vs. Lisp :
Блин, меня не интересует XML, меня интересуют потребительские качества. Если для контроля структуры лиспа нужно писать код, который здесь приводили, то лисп в этом отношении ничем не лучше C#.
AVK>>Мда, сурово. Я, если честно, ожидал поменьше.
CP>Ну это же без каких-либо библиотек, и вообще весьма прямолянейное решение, здесь нужен более общий подход, как у fionbio.
Да у него тоже как то не очень получилось. И это на примитивнейшем примере.
Здравствуйте, AndrewVK, Вы писали:
AVK>Нет. Нужно декларативное задание схемы исходного файла. Что то вроде: AVK>
AVK>тег objects
AVK>(
AVK> тег object[один или больше раз]
AVK> (
AVK> атрибут name
AVK> тег property[один или более раз]
AVK> (
AVK> атрибут name
AVK> атрибут type
AVK> )
AVK> )
AVK>)
AVK>
AVK>Идея понятна?
Имхо, на Ruby такое замутить можно. Что-то типа:
root "objects" {
element "object", ONE_OR_MORE {
attrubute "name"
element "property", ONE_OR_MORE {
attribute "name"
attribute "type"
}
}
}
Вот, сегодня наткнулся на проектик xml-mapping для Ruby, так там в документации такой пример приведен. Для xml-я:
require 'xml/mapping'
# forward declarations
class Client; end
class Address; end
class Item; end
class Signature; end
class Order
include XML::Mapping
text_node :reference, "@reference"
object_node :client, "Client", :class=>Client
hash_node :items, "Item", "@reference", :class=>Item
array_node :signatures, "Signed-By", "Signature", :class=>Signature, :default_value=>[]
def total_price
items.values.map{|i| i.total_price}.inject(0){|x,y|x+y}
end
end
class Client
include XML::Mapping
text_node :name, "Name"
object_node :home_address, "Address[@where='home']", :class=>Address
object_node :work_address, "Address[@where='work']", :class=>Address, :default_value=>nil
end
class Address
include XML::Mapping
text_node :city, "City"
text_node :state, "State"
numeric_node :zip, "ZIP"
text_node :street, "Street"
end
class Item
include XML::Mapping
text_node :descr, "Description"
numeric_node :quantity, "Quantity"
numeric_node :unit_price, "UnitPrice"
def total_price
quantity*unit_price
end
end
class Signature
include XML::Mapping
text_node :name, "Name"
text_node :position, "Position", :default_value=>"Some Employee"
end