Re[18]: Lisp
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 14.07.05 15:03
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


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


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


Ну, Андрей, попробуй привести код твоего же исходного XML, но выраженный на шарпе. И сравни с тем, что на Ruby можно написать. Просто синтаксического мусора меньше.

Да и твое замечание о том, что тоже самое можно сделать на шарпе я разделяю. Вот Влад давно мне (и не только мне) пытался доказать, что шарп в качестве сриптового языка без проблем можно использовать. Вот можно и попробовать его в этом качестве.
... << RSDN@Home 1.1.4 stable rev. 510>>


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

Вот, кстати, пример на JSE генерирующий свойсва для Явы:
// Copyright (c) 2001-2003, Jonathan Bachrach, Tom White. See file LICENSE.

import net.sf.jse.IdentifierFragment;
import net.sf.jse.Fragment;
import net.sf.jse.SyntaxMatchFailure;

public syntax property {
  case #{ 
    ?modifiers:* property ?:type ?:name ?init:*; 
  }:
  {
    Fragment getterName =
      new IdentifierFragment("get".concat(capitalize(name.getName())));
    Fragment setter = #{ };
    Fragment setterName =
      new IdentifierFragment("set".concat(capitalize(name.getName())));
    return #{
      private ?type ?name ?init;
      ?modifiers ?type ?getterName() { return ?name; }
      ?modifiers void ?setterName (?type x) { this.?name = x; }
    };
  }
  
  // Need this method since IdentifierFragment.capitalize() doesn't do the right thing...
  private static String capitalize(String s) {
    if (s.length() == 0) {
         return s;
    }
    char chars[] = s.toCharArray();
    chars[0] = Character.toUpperCase(chars[0]);
    return new String(chars);
  }
}


Этот макрос преобразует такую конструкцию:
class Bean implements Serializable
{
  public property String firstName = "Tom";
}

В такую:
class Bean implements Serializable
{ 
  private String firstName = "Tom";
  public String getFirstName () { return firstName ; }
  public void setFirstName (String x) { this.firstName = x ; }
}



Думаю из него ясно как будет выглядить твой пример.
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 15:06
Оценка:
Здравствуйте, CrazyPit, Вы писали:

AVK>>Какая?


CP>Понятно, но это делается добавлением валидаторов, но я вы сами написали что это не то что вам нужно.


Мне не нужны ручные императивные валидаторы в кодогенераторе. Потмоу что подобную валидацию можно сделать на любом современном императивном языке и лисп тут ничего не дает.

CP> Вы хотите иметь возможность декларативно задавать методы генерации, но вас не польностью устраивает XSLT, в случае использовании лиспа ИМХО правельный путь решения ваших задач — это создание декларативного языка на основе лиспа(с помощью тех же макросов), аналогичного XSLT, но лишённого некоторых недостатков.


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

CP> Но это уже достаточно сложная задача, нужно поискать, возможно что-то аналогичное уже есть.


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

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


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


AVK>То, что я говорю не о данных, а о их схеме.

То есть, калькируя Re[7]: AST-based solution
Автор: AndrewVK
Дата: 14.07.05
, схема — это вот что:
(setq schema
    '(element (name . "objects")
        (complex-type
            (all (min-occurs . "1")
                (element (name . "object")
                    (complex-type
                        (all (min-occurs . "1")
                            (element (name . "property")
                                (complex-type (name . "")
                                    (attribute (name . "name"))
                                    (attribute (name . "type"))
                                )
                            )
                        )
                    )
                )
            )
        )
    )
)

Правильно?
You aren't expected to absorb this
Re[19]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.07.05 15:16
Оценка: +1 :)
Здравствуйте, eao197, Вы писали:

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


E>Ну, Андрей, попробуй привести код твоего же исходного XML, но выраженный на шарпе.


Так, что то я теряю мысль. Ты предложил, для того чтобы из псевдодекларативности сделать декларативность реальную, преобразовывать декларативное описание в Руби. Так зачем мне тогда выражать на шарпе исходные данные, если для шарпа и XML подходит? Впрочем могу и продемонстрировать:
public interface Obj1
{
    int Prop1 {get;}
    string Prop2 {get;}
}


И заметь, это гарантированно декларативный код, а не его эмуляция. Декларативность контролируется компилятором.

E> И сравни с тем, что на Ruby можно написать. Просто синтаксического мусора меньше.


А по мне так не меньше.

E>Да и твое замечание о том, что тоже самое можно сделать на шарпе я разделяю. Вот Влад давно мне (и не только мне) пытался доказать, что шарп в качестве сриптового языка без проблем можно использовать. Вот можно и попробовать его в этом качестве.


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

C> Правильно?


Да. Теперь осталось написать валидатор .
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[8]: Lisp
От: CrazyPit  
Дата: 14.07.05 15:29
Оценка:
Здравствуйте, AndrewVK, Вы писали:


AVK>Ахринеть. А вот эта достаточно сложная задача почему то на XSLT решается без проблем.


Потому что XSLT — это специализированный декларативный язык, созданный для этих целей, а Lisp — универсальный ЯП. Но в Lisp'e легче чем во многих дургих языках можно создавать свои языки, поэтому Лисп и XSLT не стоит ставить на один уровень, вот если сначала создать свой DSL на lisp'e (я про это говорил, когда упоминал сложную задачу), тогда его уже нужно сравнивать с XSLT. Но в создание DSL мои познание пока весьма малы, есть люди которые этим плотно занимаются, вот ссылка на один такой исследовательский проект.
Re[15]: Lisp
От: WolfHound  
Дата: 14.07.05 15:52
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Думаю из него ясно как будет выглядить твой пример.

Мне нет. В примере Андрея нужно еще конструктор сгенерировать.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Lisp
От: mishaa Россия http://kmmbvnr.livejournal.com
Дата: 14.07.05 16:02
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


AVK>А можно увидеть на лиспе решение следующей задачи:

AVK>Интересует решение именно в духе лиспа.

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

Собствено задача:

есть:

<object name="A">
    <extension object="B">
</object>

<object name="B">
    <extension object="C">
</object>

<object name="C"/>



Надо:



class A
{
   public static C getInstance()
   {
       return new A(new B(new C()));
   }
}

class B
{
   public static C getInstance()
   {
       return new B(new C());
   }
}

class C
{
   public static C getInstance()
   {
       return new C();
   }
}
-- Главное про деструктор копирования не забыть --
Re[2]: Lisp
От: Павел Кузнецов  
Дата: 14.07.05 16:42
Оценка: 20 (1)
AndrewVK,

> А можно увидеть на лиспе решение следующей задачи:

> Имеем некое текстовое описание модели каких либо объектов. Пусть это будет xml. Например: <...>
> Требуется сгенерировать код на C# примерно такого вида: <...>

Я правильно понимаю, что, на самом деле, тебе не решение на Лиспе нужно, а вообще интересуют решения, связанные с кодогенерацией? Если так, смотрел ли ты на то, что используется в KDE? Например, http://conference2004.kde.org/slides/cornelius.schumacher-metaprogramming.pdf (KConfig XT: XML -> C++).
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[16]: Lisp
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.07.05 18:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Мне нет. В примере Андрея нужно еще конструктор сгенерировать.


А какая разница? Если на пальцах то идея такова...

Есть парсер который кроме обычного синтаксиса языка (в нашем случае Шарпа) поддерживает еще макросы. Далее есть некий движок который позволяет найти такой макрос в коде и раскрыть его. И писк и раскрытие делаются на базе АСТ.

Сам макрос оформляется так:
public syntax ИмяМакроса
{
    case #{ некий паттерн обнаруживающий этот самый макрос в АСТ. }
  {
        Некий императивный код которому доступны все ветки АСТ найденные 
        паттерн-матчингом.
    return
        #{
            Результирующий набор АСТ-веток часть из которых может быть сформирована
            в предыдущем блоке или взято из АСТ-веток найденных паттерн-матчингом.
    };
  }
    
    Другой императивный код оформленный в виде методов.
}


Таким образом в return можно нагородить хоть черта лысого. Бло бы то на базе чего городить.
... << RSDN@Home 1.2.0 alpha rev. 557>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Lisp
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 14.07.05 19:56
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Так, что то я теряю мысль. Ты предложил, для того чтобы из псевдодекларативности сделать декларативность реальную, преобразовывать декларативное описание в Руби.


Нет, я предлагал делать декларативное описание сразу на Руби. В этом случае валидатором (по крайней мере синтаксическим) будет сам Руби. Далее на Руби же делается преобразование описания в результирующий C# код. Схема получается практически такая же, как в Лиспе. Только, на мой вкус, читабельнее.

AVK> Так зачем мне тогда выражать на шарпе исходные данные, если для шарпа и XML подходит? Впрочем могу и продемонстрировать:

AVK>
AVK>public interface Obj1
AVK>{
AVK>    int Prop1 {get;}
AVK>    string Prop2 {get;}
AVK>}
AVK>


AVK>И заметь, это гарантированно декларативный код, а не его эмуляция. Декларативность контролируется компилятором.


Ок. Я понял идею. Т.е. такие описания нужно пропустить через шарповский компилер, затем рефлекшеном извлечь все нужные данные и по ним уже сгенерировать нужный шарповский код.

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

А поскольку ты не очерчивал заранее рамки задачи, то дальше можно пофантазировать. Например, если требуется добавить в декларацию что-то еще, что не описывается синтаксисом шарпа. У тебя в качестве варианта остается только атрибуты. Т.е. что-то типа:
public interface Obj
{
    int Prop1 {get;}
    [StrongChecking]
    string Prop2 {get;}
}

Это так же вполне удобно, до тех пор, пока синтаксиса атрибутов будет хватать. А допустим, мы хотим описывать методы с пред- и постусловиями (что-то типа контракта), где условия должны быть представлены в виде шарповского кода, чтобы результирующий код имел вид:
int Prop1
{
    // Понятно, что в getter-е вряд ли потребуются постусловия, но для демострации сойдет.
    get {
        <...some C# code...>
        int result = _prop1;
        <...some C# code...>
        return result;
    }
}


Вот тогда шапровского синтаксиса для декларативности может не хватить. В Руби/Лиспе в этом смысле запас будет, имхо, побольше. Например:
interface( "Obj" ) {
    property( "Prop1", Property::Type::INT ) {
        precondition <<-PRE
                <...some C# code...>
            PRE
        postcondition <<-PRE
                <...some C# code...>
            PRE
    }
    property( "Prop2", Property::Type::STRING ) {
        strong_checking
    }
}



Повторюсь, что без представления о том, что нужно в задаче сейчас и что может потребоваться в будущем, сложно строить предположения. Но, имхо, вариант с XML/XSLT выглядит весьма конкурентноспособно.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[12]: AST-based solution
От: cranky Украина  
Дата: 15.07.05 05:37
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


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


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


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))

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


Не знаю как в clisp, но в autolisp это записывается так:
(defun matr:trans(matr)(apply'mapcar(cons'list matr)))
, где apply, mapcar, cons и list — стандартные функции, никаких макросов, но, конечно, хранить и обрабатывать матрицы в списке списков — решение малоэффективное, хотя и единственное для данного диалекта (ну нет там массивов).
А это перемножение двух матриц:
(defun matr:*(a b)(mapcar'(lambda(j)(mapcar'(lambda(i)(apply'+(mapcar'* i j)))(matr:trans b)))a))
Интересно, кстати, завести пару матриц размерностью побольше да потестировать компилятор clisp'а на эффективность...

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

F>>в виде s-expressions.
Что такое "s-expressions"?

AVK>Результатов чего?
You aren't expected to absorb this
Re[8]: Lisp
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 15.07.05 06:36
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Ахринеть. А вот эта достаточно сложная задача почему то на XSLT решается без проблем.


Ну, если принять за постулат, что Lisp — язык для построения DSL, а XSLT это DSL, то сравнивать их нельзя. Вот разработать тот DSL, который ты хочеш, на LISP, Ruby, C# и сравнить — это да.
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[9]: Lisp
От: Кодёнок  
Дата: 15.07.05 07:16
Оценка: :)
Здравствуйте, Andrei N.Sobchuck, Вы писали:

AVK>>Ахринеть. А вот эта достаточно сложная задача почему то на XSLT решается без проблем.


ANS>Ну, если принять за постулат, что Lisp — язык для построения DSL, а XSLT это DSL, то сравнивать их нельзя. Вот разработать тот DSL, который ты хочеш, на LISP, Ruby, C# и сравнить — это да.


Почему Лиспу приписывают создание DSL? Раньше AI приписывали, сейчас DSL
Re[17]: Lisp
От: WolfHound  
Дата: 15.07.05 07:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А какая разница? Если на пальцах то идея такова...


VD>Есть парсер который кроме обычного синтаксиса языка (в нашем случае Шарпа) поддерживает еще макросы. Далее есть некий движок который позволяет найти такой макрос в коде и раскрыть его. И писк и раскрытие делаются на базе АСТ.

хъ
VD>Таким образом в return можно нагородить хоть черта лысого. Бло бы то на базе чего городить.
Я так понял что эта конструкция заменяет найденый паттрен на то что возвращает return?
Но я не понял как это можно использовать если надо из нескольких паттернов собрать одну конструкцию?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: Lisp
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 15.07.05 07:43
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Почему Лиспу приписывают создание DSL? Раньше AI приписывали, сейчас DSL


Нужно всегда быть на "гребне волны"
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[21]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.07.05 08:24
Оценка:
Здравствуйте, eao197, Вы писали:

E>Нет, я предлагал делать декларативное описание сразу на Руби. В этом случае валидатором (по крайней мере синтаксическим) будет сам Руби.


Но как гарантировать что декларативное описание останется декларативным? Или как по единственной модели сгенерить несколько исходников?

AVK>>
AVK>>public interface Obj1
AVK>>{
AVK>>    int Prop1 {get;}
AVK>>    string Prop2 {get;}
AVK>>}
AVK>>


AVK>>И заметь, это гарантированно декларативный код, а не его эмуляция. Декларативность контролируется компилятором.


E>Ок. Я понял идею. Т.е. такие описания нужно пропустить через шарповский компилер, затем рефлекшеном извлечь все нужные данные и по ним уже сгенерировать нужный шарповский код.


Не обязательно. Можно и сразу распарсить.

E>Повторюсь, что без представления о том, что нужно в задаче сейчас и что может потребоваться в будущем, сложно строить предположения. Но, имхо, вариант с XML/XSLT выглядит весьма конкурентноспособно.


Я тебе больше скажу — я на этом варианте написал уже массу кода. Но хотелось бы лучшего.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[9]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.07.05 08:24
Оценка:
Здравствуйте, CrazyPit, Вы писали:

CP>Потому что XSLT — это специализированный декларативный язык, созданный для этих целей,


Не для этого xslt создавался. Он создавался прежде всего для генерации html и xsl:fo по xml-файлам с данными. Вобщем понятно — эффективно предложенную задачу на лиспе не решить. И, заметь, совсем не потому что он универсальный. На универсальном O'Caml задачка решается не сильно хуже XSLT.
... << RSDN@Home 1.2.0 alpha rev. 565>>
AVK Blog
Re[9]: Lisp
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.07.05 08:24
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Ну, если принять за постулат, что Lisp — язык для построения DSL, а XSLT это DSL, то сравнивать их нельзя. Вот разработать тот DSL, который ты хочеш, на LISP, Ruby, C# и сравнить — это да.


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