Re[9]: Lisp
От: Cyberax Марс  
Дата: 14.07.05 13:58
Оценка:
Трурль wrote:

> C>А можно парсер Лиспа в 12 килобайт кода?

> Первый интерпретатор Лиспа работал на компьютерах с 8K памяти (правда
> не байт, а слов).

И что? В нем вообще строковый тип был?

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[9]: clarification
От: Mamut Швеция http://dmitriid.com
Дата: 14.07.05 14:00
Оценка:
_O_>Во, я как раз работаю над template-based кодогенератором (для UML 2.0) и заинтересовался функциональными языками. Проблема в том, что мне надо взаимодействовать с кодом на С++. Вопрос, есть ли возможность вызова external функций на С++ из Лисп-программы (или программы на ином ФЯ) ? Если нет, то есть ли возможность вызывать просто внешний тул из лисп-программы ? (Т.е. нужен аналог С-шной функции system() или т.п.)

Lisp Universal Foreign Function Interface

UFFI is a package to interface Common Lisp programs with C-language compatible libraries.



dmitriid.comGitHubLinkedIn
Re[10]: clarification
От: Трурль  
Дата: 14.07.05 14:04
Оценка:
Здравствуйте, Mamut, Вы писали:


M>Lisp Universal Foreign Function Interface

M>

M>UFFI is a package to interface Common Lisp programs with C-language compatible libraries.

Буквально следующее предложение:

Every Common Lisp implementation has a method for interfacing to such libraries.

Re[13]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 14:13
Оценка: 2 (2)
AVK>>Идея понятна?

E>Имхо, на Ruby такое замутить можно. Что-то типа:

E>
E>root "objects" {

E>    element "object", ONE_OR_MORE {
E>        attrubute "name"
E>        element "property", ONE_OR_MORE {
E>            attribute "name"
E>            attribute "type"
E>        }
E>    }
E>}
E>


А как на основе этого строить проверку грамматики?

E>Вот, сегодня наткнулся на проектик xml-mapping для Ruby, так там в документации такой пример приведен. Для xml-я:


Это все совсем не то, это и для дотнета есть. Видишь ли, если решать описанную задачу в лоб, как тут многие пытаются, парся xml и генерируя в императивном стиле текст, параллельно при этом проверяя корректность заглатываемых данных, о результат получается одинаков, будь то лисп, руби или C#. Увы, хоть написать такой код просто и не требует особого напряжения ума, но поддерживать подобное очень тяжело. На реальных задачах все это превращается в огромные простыни пестрого кода. Всякими фокусами на базе ООП бывает удается немного ситуацию упростить, например так,
private void GenerateParamValueDomain(XmlElement parent, XmlElement template,
    ElementParamInfo epi)
{
    XmlPattern pvp = new XmlPattern(template, parent);
    pvp.Element.SetAttribute(s_IdAttr, pvp.Element.GetAttribute(s_IdAttr) +
        epi.Rn);
    XmlElement pvevParent;
    XmlElement pvev = pvp.ExtractTemplate(s_ListParamDomainEnumValueId,
        out pvevParent);
    foreach (ParameterValueInfo pvi in epi.Values)
    {
        XmlPattern evp = new XmlPattern(pvev, pvevParent);
        evp.Element.SetAttribute(s_CodeAttr, pvi.Rn.ToString());
        evp.Element.SetAttribute(s_TextAttr, pvi.Caption);
        evp.Element.InnerText = pvi.Caption;
    }
}

но все равно получается не очень. Вариант с XSLT уже несколько лучше, поскольку удается выкинуть из структуры программы хотя бы обход основной иерархии, но жуткий синтаксис и усложнение понимания в том случае, когда по дереву приходится проходить несколько раз, делают его тоже довольно далеким от идеала. Вариант с универсальным функциональным языком (я пробовал OCaml, в сообщении Re: Задачка: придумать язык
Автор: Gaperton
Дата: 14.07.05
есть пример на Erlang-подобии) тоже не очень. С одной стороны синтаксис проще, с другой нет возможности писать просто конечный код, без того чтобы не заворачивать его в строковые константы. После заверений о крутости лиспа стало интересно посмотреть, а как на нем решить такую задачу. Но, увы, все приведенные решения являются по большей части вариациями на ту же тему.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[10]: AST-based solution
От: fionbio  
Дата: 14.07.05 14:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


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

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

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


В условиях задачи валидация не была оговорена. Я позже сделаю отдельный валидатор,
это не сложно, сейчас по просту некогда. Вообще, для многих задач приведённого
подхода вполне достаточно.

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


AVK>Не, верить не буду. Потому и прошу показать.


Это проще всего понять, попробовав. Преимуществ с точки зрения
удобства программирования много, например:

1) Возможность бысто и эффективно оттестировать каждый маленький
кусок в REPL. Упрощает отладку в сотни раз. По-хорошему, это не
отменяет юнит-тестов, их можно использовать для более крупных компонент.

2) Компактность кода. Работа с последовательностями и с деревьями/иерархиями
на C#/C++/etc. по сравнению с Лиспом — PITA. Lisp позволяет за секунды в пару
строчек описать то, что выльется в десятки-сотни строк кода на других языках.
Это связано со своеобразным подходом — имеется набор недеструктивных
функций типа remove, remove-if, mapcar и пр., чем-то напоминающих STL'евые
аналоги, но возвращающих результат в виде новой последовательности.
Конечно, это не бесплатно — написаный "с лёту" может быть вполне красив, но
не очень производителен. Но тут идея такая — сначала сделать, чтобы _всё_ работало,
затем оптимизировать. Преждевременная оптимизация — зло.
Пример компактности — транспонирование матрицы (как раз в стиле прототипа —
неоптимально по производительности, зато для лиспера — более чем компактно,
просто и ясно):
(apply #'mapcar #'list
'((1 2 3)
(4 5 6)
(7 8 9)))
-->
((1 4 7)
(2 5 8)
(3 6 9))

3) Компактная и простая запись исходных данных и промежуточных результатов
в виде s-expressions. С возможностью в любой момент без проблем посмотреть
*любые* промежуточные результаты в том же REPL.
Re[14]: Lisp
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 14.07.05 14:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


E>>Имхо, на Ruby такое замутить можно. Что-то типа:

E>>
E>>root "objects" {

E>>    element "object", ONE_OR_MORE {
E>>        attrubute "name"
E>>        element "property", ONE_OR_MORE {
E>>            attribute "name"
E>>            attribute "type"
E>>        }
E>>    }
E>>}
E>>


AVK>А как на основе этого строить проверку грамматики?


Андрей, здесь фокус в том, что это императив, который за счет фокусов Ruby выглядит как декларация.
На самом деле здесь происходит следующее:
# Вызов метода root с двумя параметрами:
# имя "objects" и блок кода в фигурных скобках.
# Так же это можно было бы записать в виде:
root( "objects" ) do

    # Вот этот блок кода может быть вызван внутри метода root
    # для какого-нибудь скрытого объекта. И следующий метод
    # element будет вызыватся для этого объекта с тремя параметрами:
    # именем "object", константой ONE_OR_MORE и блоком кода.
    element( "object", ONE_OR_MORE ) do

        # И здесь все то же самое.
        ...
    end
end


При этом Ruby не дает вызывать неизвестных методов и использовать неизвестные константы. Поэтому, если написать, что-то типа:
root "object" {
    Element "object", one_or_more { ... }
}

то сам Ruby будет ругаться на невозможность работы с Element и неопределенность one_or_more.

На таких фокусах у меня весь mxx_ru построен. Вот, пример якобы декларативности:
require 'mxx_ru/cpp'

require 'oess_1/util_cpp_serializer/gen'

Mxx_ru::setup_target(
    Mxx_ru::Cpp::Dll_target.new( "aag_3/smpp_smsc/prj.rb" ) {

    required_prj "ace/dll.rb" 

    required_prj "cls_2/prj.rb" 
    required_prj "smart_ref_3/lib.rb" 

    required_prj "threads_1/dll.rb" 

    required_prj "oess_1/defs/prj.rb" 
    required_prj "oess_1/io/prj.rb" 
    required_prj "oess_1/stdsn/prj.rb" 
    required_prj "oess_1/db/prj.rb" 

    required_prj "so_4/prj.rb" 
    required_prj "so_sysconf_2/prj.rb" 
    required_prj "so_log_1/prj.rb" 

    required_prj "mbapi_3/prj.rb" 
    required_prj "mbapi_3_mbox/core/prj.rb" 
    required_prj "mbsms_2/prj.rb" 

    required_prj "gemont_1/prj.rb" 
    required_prj "smpp_pdu_1/prj.rb" 

    required_prj "aag_3/sms_data_type/prj.rb"
    required_prj "aag_3/safe_sms_history/prj.rb"

    target "aag.smpp_smsc" 

    ddl = generator Oess_1::Util_cpp_serializer::Gen.new( self )

    cpp_source "trx_id.cpp"
    ddl.ddl_file "trx_id.ddl"

    sources_root( "impl" ) {
        cpp_source "send_trx_map.cpp" 
        cpp_source "receive_trx_map.cpp" 

        cpp_source "oess_send_trx_map.cpp"
        ddl.ddl_file "oess_send_trx_map.ddl"

        cpp_source "oess_receive_trx_map.cpp"
        ddl.ddl_file "oess_receive_trx_map.ddl"
    }

    cpp_source "cfg.cpp"
    cpp_source "a_channel.cpp"
    cpp_source "a_send_history.cpp"
    cpp_source "a_receive_history.cpp"
    cpp_source "coop_maker.cpp"
    cpp_source "coop_factory.cpp"
})


Хотя на самом деле все это чистой воды императив.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: AST-based solution
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.07.05 14:25
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Кстати, а как получить ХСД для некоторого ХМЛ-я? Кто-нить умеет ревер-инжинирить ХМЛ?
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: AST-based solution
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.07.05 14:25
Оценка: +2
Здравствуйте, fionbio, Вы писали:

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


Ну, вот Эрлинговский вариант Re: Задачка: придумать язык
Автор: Gaperton
Дата: 14.07.05
мне кажется более понятным. Я конечно не "нормальный лиспер". Но таких еще поискать нужно. Все же понятность и модифицируемость — это очень важные вещи.
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Lisp
От: andyJB  
Дата: 14.07.05 14:32
Оценка:
Здравствуйте, fionbio, Вы писали:
F>[skip]
Появился вопрос. Чем возможности CL как "метаязыка" лучше CamlP4?
Re[15]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 14:34
Оценка:
Здравствуйте, eao197, Вы писали:

AVK>>А как на основе этого строить проверку грамматики?


E>Андрей, здесь фокус в том, что это императив, который за счет фокусов Ruby выглядит как декларация.


Фокусов мне не надо. Я думал что там что то большее за этим стоит, чего я не понимаю. Прелесть декларации не в том, как это выглядит, а в том что декларация не позволяет изменить логику, вся логика прошита в интерпретаторе. Проще говоря мы заменяем подход "как?" подходом "что?".
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[16]: Lisp
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 14.07.05 14:37
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


AVK>>>А как на основе этого строить проверку грамматики?


E>>Андрей, здесь фокус в том, что это императив, который за счет фокусов Ruby выглядит как декларация.


AVK>Фокусов мне не надо. Я думал что там что то большее за этим стоит, чего я не понимаю. Прелесть декларации не в том, как это выглядит, а в том что декларация не позволяет изменить логику, вся логика прошита в интерпретаторе. Проще говоря мы заменяем подход "как?" подходом "что?".


Так на самом деле это ничему не противоречит. Ведь такое описание может просто формировать в памяти какое-то представление, которое затем будет доступно интерпритатору. А уже интерпритатор можно менять как угодно -- декларации останутся неизменными. То же самое возможно и в обратном направлении.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: Lisp
От: CrazyPit  
Дата: 14.07.05 14:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:



CP>>Из objects выбираются только те элементы, в которых первый символ — object.


AVK>А мне нужно, чтобы если там было что то, начинающееся не с object, то была бы ошибка, причем с сообщением, понятным пользователю. Наконец, правила, по которым определяется корректность, должны быть декларативными.


CP>> Если в object нет :name будет ошибка, также если в property не будет :type или :name будет ошибка.


AVK>Какая?


Понятно, но это делается добавлением валидаторов, но я вы сами написали что это не то что вам нужно. Вы хотите иметь возможность декларативно задавать методы генерации, но вас не польностью устраивает XSLT, в случае использовании лиспа ИМХО правельный путь решения ваших задач — это создание декларативного языка на основе лиспа(с помощью тех же макросов), аналогичного XSLT, но лишённого некоторых недостатков. Но это уже достаточно сложная задача, нужно поискать, возможно что-то аналогичное уже есть.
Re[12]: Lisp
От: cranky Украина  
Дата: 14.07.05 14:44
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


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

[...]

AVK>Нет. Нужно декларативное задание схемы исходного файла. Что то вроде:

AVK>
AVK>тег objects
AVK>(
AVK>    тег object[один или больше раз]
AVK>    (
AVK>        атрибут name
AVK>        тег property[один или более раз]
AVK>        (
AVK>            атрибут name
AVK>            атрибут type
AVK>        )
AVK>    )
AVK>)
AVK>


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


Ну а с этим списком/схемой что было не так?
(setq objs
    '("objects"
        ("object" ("name" . "Obj1")
            ("property"
                (("name" . "prop1") ("type" . "int"))
                (("name" . "prop2") ("type" . "string"))
            )
        )
    )
)
You aren't expected to absorb this
Re[11]: AST-based solution
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 14:44
Оценка:
Здравствуйте, fionbio, Вы писали:

AVK>>Не, верить не буду. Потому и прошу показать.


F>Это проще всего понять, попробовав.


Вот я и хочу попробовать. Но прежде чем тратить уйму времени на то, чтобы начать делать концептуально кривые программки, я прошу показать мне пример правильного решения простенькой задачи. Пока что вижу все то же, что есть и в других языках.

F>1) Возможность бысто и эффективно оттестировать каждый маленький

F>кусок в REPL.

Что такое REPL? Отладчик местный?

F>2) Компактность кода.


Пока что даже XSLT на конкретной задаче оказался не сильно хуже. А уж у него избыточность синтаксиса жуткая.

F> Работа с последовательностями и с деревьями/иерархиями

F>на C#/C++/etc. по сравнению с Лиспом — PITA. Lisp позволяет за секунды в пару
F>строчек описать то, что выльется в десятки-сотни строк кода на других языках.

Например?

F>Это связано со своеобразным подходом — имеется набор недеструктивных

F>функций типа remove, remove-if, mapcar и пр., чем-то напоминающих STL'евые
F>аналоги, но возвращающих результат в виде новой последовательности.

Просто функциональный стиль? Это много где есть. Есть масса функциональных языков, при помощи шаблонов в C++ и анонимных методов в C# функциональный стиль в определенной мере можно эмулимровать.

F>Пример компактности — транспонирование матрицы


Это по твоему работа со списками? Трансформирование матрицы это конечно здорово, но это не та задача, которая лично мне интересна.

F>(как раз в стиле прототипа -

F>неоптимально по производительности, зато для лиспера — более чем компактно,
F>просто и ясно):
F>(apply #'mapcar #'list
F> '((1 2 3)
F> (4 5 6)
F> (7 8 9)))
-->>
F>((1 4 7)
F> (2 5 8)
F> (3 6 9))

Ага, а за этим стоит какой нибудь чудовищный макрос. Ну и зачем?

F>3) Компактная и простая запись исходных данных и промежуточных результатов

F>в виде s-expressions.

Результатов чего?
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[9]: AST-based solution
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 14:44
Оценка: 22 (1)
Здравствуйте, VladD2, Вы писали:

VD>Кстати, а как получить ХСД для некоторого ХМЛ-я? Кто-нить умеет ревер-инжинирить ХМЛ?


xsd.exe. Только надо понимать, что возможности по угадыванию у нее весьма ограничены. Вот к примеру по тому, что я привел она генерит такую схему:
<xs:schema id="objects" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="objects" msdata:IsDataSet="true" msdata:Locale="ru-RU">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="object">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="property" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:attribute name="name" type="xs:string" />
                  <xs:attribute name="type" type="xs:string" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>


Как видишь — несильно отличается от того, что я нарисовал вручную. В более сложных случаях конечно уже не все так радужно.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[9]: AST-based solution
От: Cyberax Марс  
Дата: 14.07.05 14:47
Оценка: 24 (2)
VladD2 wrote:

> Кстати, а как получить ХСД для некоторого ХМЛ-я? Кто-нить умеет

> ревер-инжинирить ХМЛ?

Я пользовался когда-то XMLSpy'ем для этого.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[14]: Lisp
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.07.05 14:50
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Я вот все подумываю как к R#-у прикрутить нечто вроде этого:
http://people.csail.mit.edu/jrb/jse/index.htm
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: clarification
От: Mamut Швеция http://dmitriid.com
Дата: 14.07.05 14:52
Оценка:
M>>Lisp Universal Foreign Function Interface
M>>

M>>UFFI is a package to interface Common Lisp programs with C-language compatible libraries.

Т>Буквально следующее предложение:
Т>

Every Common Lisp implementation has a method for interfacing to such libraries.


Именно поэтому UFFI ривлекает своей "универсальностью". Тем более, что поддерживает основные платформы


dmitriid.comGitHubLinkedIn
Re[17]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 14:55
Оценка:
Здравствуйте, eao197, Вы писали:

E>Так на самом деле это ничему не противоречит. Ведь такое описание может просто формировать в памяти какое-то представление, которое затем будет доступно интерпритатору. А уже интерпритатор можно менять как угодно -- декларации останутся неизменными. То же самое возможно и в обратном направлении.


Можно. Но тот же вопрос — зачем тогда Руби? То же самое я могу сделать, к примеру, на шарпе.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[13]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 14:55
Оценка:
Здравствуйте, cranky, Вы писали:

C>Ну а с этим списком/схемой что было не так?

C>
C>(setq objs
C>    '("objects"
C>        ("object" ("name" . "Obj1")
C>            ("property"
C>                (("name" . "prop1") ("type" . "int"))
C>                (("name" . "prop2") ("type" . "string"))
C>            )
C>        )
C>    )
C>)
C>


То, что я говорю не о данных, а о их схеме.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.