Re[7]: AST-based solution
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 11:38
Оценка: 25 (3)
Здравствуйте, eao197, Вы писали:

AVK>>Можно. Только вот одна засада — жутко неудобно. Привести пример xsd, или на слово поверишь, что будет на порядок лаконичнее?


E>Андрей, если не сложно, приведи -- мне интересно.


Не сложно. Правда на таком примитивном примере не все будет видно.
<xs:schema
        targetNamespace="sample_model"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">
    <xs:element name="objects">
        <xs:complexType>
            <xs:all minOccurs="1">
                <xs:element name="object">
                    <xs:complexType>
                        <xs:all minOccurs="1">
                            <xs:element name="property">
                                <xs:complexType name="">
                                    <xs:attribute name="name"/>
                                    <xs:attribute name="type"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:all>
                        <xs:attribute name="name"/>
                    </xs:complexType>
                </xs:element>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[7]: AST-based solution
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 11:38
Оценка: +1
Здравствуйте, fionbio, Вы писали:

F>Верю, XSD себе представляю. Но. Во-первых, если проверку в Лиспе сделать

F>отдельно, она будет, понятное дело, короче.

Мне пофигу — короче она или длиннее. По символам xsd может и не сильно меньше будет. Дело в другом. Приведенный тобой код поддерживать — это застрелиться просто. XS поддерживать несравнимо проще, просто потому что намного проще структура.

F>голову (особенно это касается 1.0). В третьих, никто, блин, не мешает на входе

F>получать XML — его ж можно отпарсить в одну строчку через pxmlutils в sexpr,
F>а потом перевести в удобоваримый вид с практически нулевыми трудозатратами.

Вот только смысл в лиспе тогда совсем небольшой получается.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[7]: clarification
От: fionbio  
Дата: 14.07.05 11:39
Оценка:
Чтобы не возникло путаницы.

1. Приведённые функции осуществляют не только валидацию,
но и генерацию дерева. Проверки осуществляются несколькими
assert'ами (генерирующими исключения при ошибке). Это,
может быть, несколько quick-and-dirty по сравнению
с отдельной схемой вроде XSD, но для целей этого примера
вполне достаточно.

2. Эти ассерты всё-таки едва ли намного длиннее XSD схемы,
хотя у неё есть плюс — декларативность. Но, в конце концов,
никто не мешает на крайняк использовать в качестве источника
XML, у которого можно валидировать схему. Да и на Лиспе
если уж так надо схемовый валидатор сделать совсем не трудно.

3. XSL шаблоны неудобны для генерации кода. Текстовые темплейты
(самопальные или с исп. готовой либы) в Лиспе использовать удобнее.
Здесь же вообще рассматривается подход без текстовых шаблонов,
с использованием AST.
Re[8]: AST-based solution
От: fionbio  
Дата: 14.07.05 11:43
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, fionbio, Вы писали:


F>>Верю, XSD себе представляю. Но. Во-первых, если проверку в Лиспе сделать

F>>отдельно, она будет, понятное дело, короче.

AVK>Мне пофигу — короче она или длиннее. По символам xsd может и не сильно меньше будет. Дело в другом.

AVK>Приведенный тобой код поддерживать — это застрелиться просто.
AVK>XS поддерживать несравнимо проще, просто потому что намного проще структура.

Этот код — генератор, а не валидатор (исправленные функции оригинала)!!!
Валидацию я сделал по ходу дела. Любой нормальный лиспер в этом коде разберётся
без проблем за 0,5 секунды. И поддерживать — никаких проблем.

F>>голову (особенно это касается 1.0). В третьих, никто, блин, не мешает на входе

F>>получать XML — его ж можно отпарсить в одну строчку через pxmlutils в sexpr,
F>>а потом перевести в удобоваримый вид с практически нулевыми трудозатратами.

AVK>Вот только смысл в лиспе тогда совсем небольшой получается.


Генерация, блин. Оно лучше гораздо, чем XSLT, поверьте. Удобоваримее и проще.
Re[7]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 11:48
Оценка:
Здравствуйте, cranky, Вы писали:

AVK>>Здорово, но я вобще то в лиспе не особо разбираюсь. Можно комментарии где и что и каким образом?


C>Вот:


Ну понятно, опять императивный код. Я же говорил о другом — о декларативном задании схемы. Например как в сообщении Re[7]: AST-based solution
Автор: AndrewVK
Дата: 14.07.05
.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[9]: AST-based solution
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 11:58
Оценка:
Здравствуйте, fionbio, Вы писали:

F>Этот код — генератор, а не валидатор (исправленные функции оригинала)!!!

F>Валидацию я сделал по ходу дела. Любой нормальный лиспер в этом коде разберётся
F>без проблем за 0,5 секунды. И поддерживать — никаких проблем.

Не, ты мне покажи валидацию. Это важно. А если валидация совмещена с генерацией, то это еще хуже.

F>Генерация, блин. Оно лучше гораздо, чем XSLT, поверьте. Удобоваримее и проще.


Не, верить не буду. Потому и прошу показать.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[8]: Lisp
От: cranky Украина  
Дата: 14.07.05 12:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, cranky, Вы писали:


AVK>>>Здорово, но я вобще то в лиспе не особо разбираюсь. Можно комментарии где и что и каким образом?


C>>Вот:


AVK>Ну понятно, опять императивный код. Я же говорил о другом — о декларативном задании схемы. Например как в сообщении Re[7]: AST-based solution
Автор: AndrewVK
Дата: 14.07.05
.

Можно определения того и другого подхода?
You aren't expected to absorb this
Re[9]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 12:36
Оценка:
Здравствуйте, cranky, Вы писали:

AVK>>Ну понятно, опять императивный код. Я же говорил о другом — о декларативном задании схемы. Например как в сообщении Re[7]: AST-based solution
Автор: AndrewVK
Дата: 14.07.05
.

C>Можно определения того и другого подхода?

Можно.
http://en.wikipedia.org/wiki/Imperative_programming
http://en.wikipedia.org/wiki/Declarative_programming
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[4]: Lisp
От: CrazyPit  
Дата: 14.07.05 12:42
Оценка:
Здравствуйте, AndrewVK, Вы писали:



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. Большая просьба — лишнее цитирование из ответа выкидывать.


Ок.
Re[3]: AST-based solution
От: CrazyPit  
Дата: 14.07.05 12:46
Оценка: +1
Здравствуйте, fionbio, Вы писали:

F>[ Эх, обогнали меня Вчера накалякал пример, хоть и башка

F>была весь день какая-то мутная — странно, не пил вроде. Запостить
F>вчера моральных сил не хватило ]

F>Попробую привести решение в духе Лиспа

F>.....

Очень интересно было почитать и потестить код. Буду читать доку. В этих двух тредах я столько полезных ссылок нашёл, сам бы я на них ещё неизвестно когда вышел...
Re[7]: Lisp
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.07.05 12:56
Оценка: +1
Здравствуйте, aka50, Вы писали:

VD>>А зачем тогда Lisp? XSLT и конечное решение в две строчки пишется.

A>Но лисп то появился до XSLT .

И что теперь? Напомню, на дворе 2005-й год.
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Lisp
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.07.05 12:56
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>Ну, после приведенных Lisp-овских примеров (Re[2]: Lisp
Автор: CrazyPit
Дата: 14.07.05
, Re[2]: Lisp
Автор: faulx
Дата: 14.07.05
) стало понятно, что я в своем предположении не ошибся -- нафига XML, если Lisp описывает тоже самое?


Примеры уже больше и сложнее чем ХСЛТ АВК. А что будет если еще соблюсти оригинальный стандарт?

Кстати, то что больше это еще ладно. В конце коцов средсвто универсальное. Но вот читаемость кода явно проигрывает ХСЛТ-шному решению.
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Lisp
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.07.05 12:56
Оценка:
Здравствуйте, eao197, Вы писали:

Забавно, что решение на Руби оказалось короче Лисповского и при этом использует формат описанный в постановке задачи. Хотя тому есть простое объяснение. Использовалась библиотека и язык запростов — XPath. Без них было бы куда длинее.

Интересно было бы глянуть на полное решение на Лиспе. Кстати, на Окамле тоже.
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Lisp
От: cranky Украина  
Дата: 14.07.05 13:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, cranky, Вы писали:


AVK>>>Ну понятно, опять императивный код. Я же говорил о другом — о декларативном задании схемы. Например как в сообщении Re[7]: AST-based solution
Автор: AndrewVK
Дата: 14.07.05
.

C>>Можно определения того и другого подхода?

AVK>Можно.

AVK>http://en.wikipedia.org/wiki/Imperative_programming
AVK>http://en.wikipedia.org/wiki/Declarative_programming
Ясно. Значит нужны правила типа таких:
(defun generate-constructor (name propertys) ...)
(defun generate-private-propertys-and-access-methods (propertys) ...)
(defun generate-class-from-normalized (&key name propertys) ...)
(defun generate-classes (description) ...)

Но мой же вариант получился короче и, вроде, понятнее? Плюс его несложно расширять и изменять...
You aren't expected to absorb this
Re[8]: clarification
От: _Obelisk_ Россия http://www.ibm.com
Дата: 14.07.05 13:31
Оценка:
Здравствуйте, fionbio, Вы писали:

F>Чтобы не возникло путаницы.


F>3. XSL шаблоны неудобны для генерации кода. Текстовые темплейты

F>(самопальные или с исп. готовой либы) в Лиспе использовать удобнее.
F>Здесь же вообще рассматривается подход без текстовых шаблонов,
F>с использованием AST.

Во, я как раз работаю над template-based кодогенератором (для UML 2.0) и заинтересовался функциональными языками. Проблема в том, что мне надо взаимодействовать с кодом на С++. Вопрос, есть ли возможность вызова external функций на С++ из Лисп-программы (или программы на ином ФЯ) ? Если нет, то есть ли возможность вызывать просто внешний тул из лисп-программы ? (Т.е. нужен аналог С-шной функции system() или т.п.)

И еще, например Tcl-интерпретатор можно встроить в программу на С/С++, а можно ли подобное сделать с каким либо ФЯ ?



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[11]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 13:31
Оценка:
Здравствуйте, cranky, Вы писали:

C>Ясно. Значит нужны правила типа таких:

C>
C>(defun generate-constructor (name propertys) ...)
C>(defun generate-private-propertys-and-access-methods (propertys) ...)
C>(defun generate-class-from-normalized (&key name propertys) ...)
C>(defun generate-classes (description) ...)
C>


Нет. Нужно декларативное задание схемы исходного файла. Что то вроде:
тег objects
(
    тег object[один или больше раз]
    (
        атрибут name
        тег property[один или более раз]
        (
            атрибут name
            атрибут type
        )
    )
)


Идея понятна?

C>Но мой же вариант получился короче и, вроде, понятнее?

C> Плюс его несложно расширять и изменять...

Нет, ничуть не понятнее. Он тебе кажется короче и понятнее, потому что пример игрушечный.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[8]: Lisp
От: fionbio  
Дата: 14.07.05 13:34
Оценка: 8 (1) :)
Здравствуйте, 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\
Re[3]: Lisp
От: ON  
Дата: 14.07.05 13:40
Оценка:
C "железным кодом" все понятно. По-моему это вообще очень мало пересекающиеся задачи — заставить железку работать и формализовать предметную область. К сожалению термин "программирование" только один. Первое меня, как и большинство людей, считающих себя программистами не интересует.

Все же мне кажется можно поискать компромисс. Между созданием своей операционки с Лиспом в качестве системного языка, и разработкой своих версий встроенного Лиспа при создании больших приложений. Лучше всего писать на привычном языке, а для вещей, которые более естественно реализуются на Лиспе иметь небольшой движок Лиспа. У меня есть интепретатор Марка Адлера, но боюсь он в чем-то урезан, и хотелось бы к нему заодно иметь и основные Лисп-библиотеки, и желательно по возможности переделанные в С, чтоб работали побыстрее. А сам движок можно оставить интерпретатором. Вот таким я бы пользовался.

Еще вот мысль. Для Лиспа не было попыток сделать типа стилей, как в Word. Чтобы для символа можно было определить как в редакторе форматировать его ветви. Чтобы полностью в 2D, а не одними шрифтами и цветом — таблицы как таблицы, деревья как деревья. Такой бы конструктор получился.
Posted via RSDN NNTP Server 1.9
Re[5]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 13:42
Оценка:
Здравствуйте, 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.


Да у него тоже как то не очень получилось. И это на примитивнейшем примере.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[12]: Lisp
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 14.07.05 13:48
Оценка:
Здравствуйте, 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-я:
<?xml version="1.0" encoding="ISO-8859-1"?>

  <Order reference="12343-AHSHE-314159">
    <Client>
      <Name>Jean Smith</Name>
      <Address where="home">
        <City>San Mateo</City>
        <State>CA</State>
        <ZIP>94403</ZIP>
        <Street>2000, Alameda de las Pulgas</Street>
      </Address>
      <Address where="work">
        <City>San Francisco</City>
        <State>CA</State>
        <ZIP>94102</ZIP>
        <Street>98765, Fulton Street</Street>
      </Address>
    </Client>

    <Item reference="RF-0001">
      <Description>Stuffed Penguin</Description>
      <Quantity>10</Quantity>
      <UnitPrice>8.95</UnitPrice>
    </Item>

    <Item reference="RF-0034">
      <Description>Chocolate</Description>
      <Quantity>5</Quantity>
      <UnitPrice>28.50</UnitPrice>
    </Item>

    <Item reference="RF-3341">
      <Description>Cookie</Description>
      <Quantity>30</Quantity>
      <UnitPrice>0.85</UnitPrice>
    </Item>

    <Signed-By>
      <Signature>
        <Name>John Doe</Name>
        <Position>product manager</Position>
      </Signature>

      <Signature>
        <Name>Jill Smith</Name>
        <Position>clerk</Position>
      </Signature>

      <Signature>
        <Name>Miles O'Brien</Name>
      </Signature>
    </Signed-By>

  </Order>


Описываются вот такие Ruby-классы:
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


И вот так затем может использоваться:
o.client.name="James T. Kirk"
o.items['RF-4711'] = Item.new
o.items['RF-4711'].descr = 'power transfer grid'
o.items['RF-4711'].quantity = 2
o.items['RF-4711'].unit_price = 29.95

o.reference = "FOOBAR-1234"

o.client = Client.new
o.client.name = 'Ford Prefect'
o.client.home_address = Address.new
o.client.home_address.street = '42 Park Av.'
o.client.home_address.city = 'small planet'
o.client.home_address.zip = 17263
o.client.home_address.state = 'Betelgeuse system'

o.items={'XY-42' => Item.new}
o.items['XY-42'].descr = 'improbability drive'
o.items['XY-42'].quantity = 3
o.items['XY-42'].unit_price = 299.95


При этом корректность схемы проверяет сам Ruby, т.к. он не позволяет обращатся к неизвестным атрибутам/методам класса.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.