Здравствуйте, alvas, Вы писали:
ВВ>>Посмотрите, как реализован ElaArray. У массива есть встроенные поля, представляющие собой функции для изменения его in-place. Также полезно глянуть на ElaRecord. Он как раз поддерживает GetField|SetField.
A>Спасибо за информацию, но я просил код примера.
А чем приведенные мной ссылки не нравятся?
Re[7]: Ela. Разработка интерпретируемого языка программирова
Здравствуйте, alvas, Вы писали:
A>Да всем нравится, но глянь как все красиво начиналось. A>Можно "передать любой — целое число, массив, собственный тип — неважно". A>А закончилось ...
Я ведь тебе сказал, что автоматических биндингов нет. Следовательно, нужно писать враппер. Что никак не отменяет вышесказанного.
A>Так можешь выложить пример как изменить заголовок формы или там ее размер передав в Ela?
Пишешь враппер
Как-то так:
public sealed class ElaForm : ElaObject
{
private Form form;
public ElaForm(Form form) : base(ElaTraits.GetField|ElaTraits.SetField)
{
this.form = form;
}
protected override ElaValue GetField(string field, ExecutionContext ctx)
{
if (field == "Text")
return new ElaValue(form.Text);
else
{
ctx.UnknownField(field, new ElaValue(this));
return Default();
}
}
protected override void SetField(string field, ElaValue value, ExecutionContext ctx)
{
if (field == "Text")
form.Text = value.AsString(ctx);
else
ctx.UnknownField(field, new ElaValue(this));
}
}
Далее выполняешь код, используя исправленную функцию Eval из доки:
Eval("$obj.Text <- \"New form caption\"", new { obj = new ElaForm(myForm) });
Re[9]: Ela. Разработка интерпретируемого языка программирова
Здравствуйте, alvas, Вы писали:
A>Вот это другое дело A>Буду копать
На самом деле имитировать классы для Ela не очень удобно. Лучше все-таки готовить более функциональное АПИ. Его и из языка будет удобнее использовать. Например, альтернативная реализация вышеприведенного, но через модуль будет выглядеть так:
//Универсальный враппер для любого объекта, для Ela - это блек бокс. Работать можно только через ваше АПИ.public sealed class ElaWrapper<T> : ElaObject
{
public T Value { get; private set; }
public ElaForm(T value) : base(ElaTraits.None)
{
Value = value;
}
}
public class FormModule : Ela.Linking.ForeignModule
{
public override void Initialize()
{
base.Add<ElaObject>("create", CreateForm);
base.Add<String,ElaObject,ElaObject>("setCaption", SetCaption);
base.Add<ElaObject,String>("getCaption", GetCaption);
base.Add<Int32,ElaObject,ElaObject>("setWidth", SetWidth);
base.Add<ElaObject,Int32>("getWidth", GetWidth);
base.Add<Int32,ElaObject,ElaObject>("setHeight", SetHeight);
base.Add<ElaObject,Int32>("getHeight", GetHeight);
}
public ElaObject CreateForm()
{
return new ElaWrapper<Form> { Value = new Form { Text = caption } };
}
public ElaObject SetCaption(string caption, ElaObject obj)
{
var frm = (ElaWrapper<Form>)obj;
obj.Value.Text = caption;
return obj;
}
public string GetCaption(ElaObject obj)
{
var frm = (ElaWrapper<Form>)obj;
return obj.Value.Text;
}
public ElaObject SetWidth(int width, ElaObject obj)
{
var frm = (ElaWrapper<Form>)obj;
obj.Value.Width = width;
return obj;
}
public int GetWidth(ElaObject obj)
{
var frm = (ElaWrapper<Form>)obj;
return obj.Value.Width;
}
public ElaObject SetHeight(int height, ElaObject obj)
{
var frm = (ElaWrapper<Form>)obj;
obj.Value.Height = height;
return obj;
}
public int GetHeight(ElaObject obj)
{
var frm = (ElaWrapper<Form>)obj;
return obj.Value.Height;
}
}
Использование:
open Form with create, setCaption, setWidth, setHeight
//В конце получаем инициализированную форму
let frm = create () |> setCaption "Form1" |> setWidth 100 |> setHeight 200
Re: Ela. Разработка интерпретируемого языка программирования
Здравствуйте, Воронков Василий Владимирович, Вы писали:
Всетаки для динамических языков нужна псевдотипизация для интеллисенсе прежде всего.
Очень удобно получатьподсказку через точку,сигнатуры методв итд. При этом резко уменьшается число опечаток и набор текста, т.к. писать приходится оочень много.
По поврду наследования тожеспорно, т.к. при наличии иерархии общих полей и методов,общую часть приходится выводить в отдельные модули а при развитом наследовании вызывает путаницу, чего нет при перекрытии предка. Здесь опять же речь идет не о контракте, а о повторном использовании кода, что в реализации не сложно при налчии модулей предка.
и солнце б утром не вставало, когда бы не было меня
Re[2]: Ela. Разработка интерпретируемого языка программирова
Здравствуйте, Serginio1, Вы писали:
S>Всетаки для динамических языков нужна псевдотипизация для интеллисенсе прежде всего. S>Очень удобно получатьподсказку через точку,сигнатуры методв итд. При этом резко уменьшается число опечаток и набор текста, т.к. писать приходится оочень много.
Ну это отедльная задача. Делать ограниченный вывод типов можно и для динамического языка. Собственно, так нередко делается. См. тот же pychecker.
S> По поврду наследования тожеспорно, т.к. при наличии иерархии общих полей и методов,общую часть приходится выводить в отдельные модули а при развитом наследовании вызывает путаницу, чего нет при перекрытии предка. Здесь опять же речь идет не о контракте, а о повторном использовании кода, что в реализации не сложно при налчии модулей предка.
Вовсе необязательно. Наследование по сути не более чем ad hoc полиморфизм. Причем далеко не самая удачная его форма. Те же тайп-классы в Хаскеле с этой функцией справляются куда удачнее. Динамическому языку ничего и делать-то особо не нужно, чтобы получить такой полиморфизм. Он там как бы "первоклассный". Чтобы на каком-нибудь ДжаваСкрипте имитировать наследование не нужны даже прототипы — достаточно обычных объеков. Разница по сравнению, скажем, с Питоном в том, что ДжаваСкрипте функция-конструктор объекта будет просто функцией. В питоне — она будет делать вид, что является классом, тогда как на самом деле не более чем функция конструктор.
Здесь важно то, что в динамических языках классов нет. Ибо нет системы типов — в том смысле, в котором этот термин употреблял, скажем, Пирс, — и класс не может выступать в роли "контракта", ибо этот контракт просто некому проверять. Поэтому что бы ты ни делал, все равно будет просто утиная типизация.
Re[3]: Ela. Разработка интерпретируемого языка программирова
ВВ>Здесь важно то, что в динамических языках классов нет. Ибо нет системы типов — в том смысле, в котором этот термин употреблял, скажем, Пирс, — и класс не может выступать в роли "контракта", ибо этот контракт просто некому проверять. Поэтому что бы ты ни делал, все равно будет просто утиная типизация.
Может я не совсем понял, но объектные функции мало ничем не отличаются от функций расширения. В том же питоне объект указывается явно.
Вот очень неудобно работать со структурами, т.к. они не поддерживают наследование и перекрытие функций. По сути наследование без классов это использование методов структуры принятую за предка. Контракт существует, но на уровне имен и сигнатуры методов.При этом проверка происходит только во время исполнения.
Но и можно в теле метода наследника ссылаеться на метод предка без копирования метода.
А иерархия в моей работе неизбежна, и недостатки наследования для меня очевидны.
и солнце б утром не вставало, когда бы не было меня
Re[4]: Ela. Разработка интерпретируемого языка программирова
Здравствуйте, Serginio1, Вы писали:
ВВ>>Здесь важно то, что в динамических языках классов нет. Ибо нет системы типов — в том смысле, в котором этот термин употреблял, скажем, Пирс, — и класс не может выступать в роли "контракта", ибо этот контракт просто некому проверять. Поэтому что бы ты ни делал, все равно будет просто утиная типизация. S> Может я не совсем понял, но объектные функции мало ничем не отличаются от функций расширения. В том же питоне объект указывается явно. S> Вот очень неудобно работать со структурами, т.к. они не поддерживают наследование и перекрытие функций. По сути наследование без классов это использование методов структуры принятую за предка. Контракт существует, но на уровне имен и сигнатуры методов.При этом проверка происходит только во время исполнения.
Все, что ты описываешь, решается без наследования. "Структура" на самом деле представляет собой просто хэш-таблицу с функциями. Наследование — копирование хэш-таблицы. Перекрытие — замена отдельных ключей в хэш-таблице. Это, если хочешь, готовая таблица диспетчеризации, которую ты можешь заполнять ручками.
В реальности классы а ля Питон — это не более чем сахар над подобным механизмом. Ну т.е. сахар этот может и уместен и упрощает использование языка, но это совсем не те же самые классы, что в С++, шарпе, Джаве и пр.
Тайп-классы еще лучше. Лучше тем, что это все та же хэш-таблица с функциями — причем именно так все и реализовано в том же Хаскеле. Но хэш-таблица не прибита гвоздями к объекту, а передается отдельно. Т.о. можно передать один и тот же набор методов для разных объектов. Мы просто-напросто перестаем прикидываться классами и выворачиваем механизм с хэш-таблицами явно, и он в результате становится более гибким.
Я лишь хочу сказать, что программировать в ООП-стиле можно практически на любом динамическом языке, для этого не нужно каких-то специальных фич. ООП — это фактически ad hoc полиморфизм через объекты, он присутствует в любой динамике, если там вообще есть возможность создать объект.
Но под class based OOP я все же понимаю вполне конкретную штуку. И эта штука, если посмотреть объективно, нереализуема в динамически-типизированном языке просто потому что она изначально расчитана на статику и требует наличия системы типов.
Re[5]: Ela. Разработка интерпретируемого языка программирова
ВВ>Но под class based OOP я все же понимаю вполне конкретную штуку. И эта штука, если посмотреть объективно, нереализуема в динамически-типизированном языке просто потому что она изначально расчитана на статику и требует наличия системы типов.
Под ООП подразумевается наследование, перекрытие. А как оно будет реализовано никого не волнунет.
Так или иначе присутствуют некая структура (Хэш таблица) с методами, методы внутри могут ссылаться на метод другой структуры являющейся для данной структуры base.
То есть присутсвует поле base.
Решение просто генерить методы которые присутствуют в base если эти методы не перекрыватся, внутри которых вызов методов base.
Это не противоречит и твоим понятиям об ООП. Просто добавить другой вид сахара.
Так и в структурах из-за того что нет наследования присутствует поля структуры являющиеся по сути родителем.
Так или иначе суть иерархи присутсвет во многис случаях, и удобное повторное использование кода c перекрытием всегда будет приветствоваться.
А ООП по сути свой и есть сахар.
и солнце б утром не вставало, когда бы не было меня
Re[6]: Ela. Разработка интерпретируемого языка программирова
Можно даже не имея предварительно информации о типе родителя, пересылать все методы которые не находятся в объекте
пересылать полю являющемся родителем. Это поле может быть единственным, а может и нет (при множественном наследовании).
Сдесь уже от реализации зависит.
и солнце б утром не вставало, когда бы не было меня
Re[7]: Ela. Разработка интерпретируемого языка программирова
Здравствуйте, Serginio1, Вы писали:
S>Можно даже не имея предварительно информации о типе родителя, пересылать все методы которые не находятся в объекте S>пересылать полю являющемся родителем. Это поле может быть единственным, а может и нет (при множественном наследовании). S>Сдесь уже от реализации зависит.
Ты уже практически изобрел Prototype based OOP через делегацию
Re: Ela. Разработка интерпретируемого языка программирования
ВВВ>Авторы: ВВВ> Воронков Василий Владимирович
ВВВ>Аннотация: ВВВ>Описание проекта, посвященного разработке языка программирования Ela с использованием C# и .NET Framework.
С удовольствием смотрю за развитием Ela.
Хотел спросить. Вы книгу сразу на английском пишете или есть русские черновики?
Если есть — не могли бы вы их выслать или выложить в открытый доступ?
Здравствуйте, alvas, Вы писали:
A>С удовольствием смотрю за развитием Ela. A>Хотел спросить. Вы книгу сразу на английском пишете или есть русские черновики? A>Если есть — не могли бы вы их выслать или выложить в открытый доступ?
Черновиков русских нет. Да вроде мой английский... эээ... достаточно "русский"
А на русском я недавно блог завел: http://blogs.msdn.com/b/__1/
Там скорее в целом об ФП "простым языком", так сказать. Но есть и пересечения с книгой.
Re[3]: Ela. Разработка интерпретируемого языка программирова
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Черновиков русских нет. Да вроде мой английский... эээ... достаточно "русский"
Печально. Просто последнюю версию ela скачало 6 человек. Последнюю книгу 15. Я в том числе.
Я это 17% и 7% аудитории соответственно = русскоязычная аудитория. Как минимум. Надеюсь больше
Стоит ли игнорировать эту аудиторию, ориентируясь на абстрактных англоязычных?
P.S. Nemerle потому и ожил, что вокруг него собралось комьюнити. В данном случае русскоговрящее.
Здравствуйте, alvas, Вы писали:
A>Печально. Просто последнюю версию ela скачало 6 человек. Последнюю книгу 15. Я в том числе. A>Я это 17% и 7% аудитории соответственно = русскоязычная аудитория. Как минимум. Надеюсь больше
Честно, не очень понял, что за проценты
A>Стоит ли игнорировать эту аудиторию, ориентируясь на абстрактных англоязычных? A>P.S. Nemerle потому и ожил, что вокруг него собралось комьюнити. В данном случае русскоговрящее.
Мне казалось, английскую смогут читать все, как русскоговорящие, так и англоговорящие. А русскую — только русские.
A>P.P.S. В общем я за русскую версию книги
Из идеологических соображений или на английском действительно тяжело читать?
Re[5]: Ela. Разработка интерпретируемого языка программирова
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, alvas, Вы писали:
A>>Печально. Просто последнюю версию ela скачало 6 человек. Последнюю книгу 15. Я в том числе. A>>Я это 17% и 7% аудитории соответственно = русскоязычная аудитория. Как минимум. Надеюсь больше
ВВ>Честно, не очень понял, что за проценты
A>>Стоит ли игнорировать эту аудиторию, ориентируясь на абстрактных англоязычных? A>>P.S. Nemerle потому и ожил, что вокруг него собралось комьюнити. В данном случае русскоговрящее.
ВВ>Мне казалось, английскую смогут читать все, как русскоговорящие, так и англоговорящие. А русскую — только русские.
A>>P.P.S. В общем я за русскую версию книги
ВВ>Из идеологических соображений или на английском действительно тяжело читать?
Тяжело читать потому что не родной.
Как я читаю доку на русском? Распечатываю на принтере и привет диван
Как я читаю доку на английском? Гугл Транслейт и прощай диван
VladD2 пишет статьи на русском, а потом просит перевести ее на английский. Ты же не считаешь его тупым?
Если перевод на русский будешь делать только для меня — естественно шкурка выделки не стоит. Но есть хороший шанс создать комьюнити вокруг Ela на rsdn. Много тебе фидбека от "абстрактных англоговорящих"? Если, да — не парься. Если нет — подумай над моими словами.
P.S. Я ощутил потенциал Ela + твоя скорость обновлений вдохновляют.
Ты понимаешь, я так вопрос не ставил. И действительно не думал, что кто-то будет читать через Гугл Транслейт. С т.з. скорости мне все равно, на каком языке писать — я много лет писал техническую документацию на английском. Если бы на русском я бы смог писать книгу, скажем, в два раза быстрее, то тут вопроса бы не возникло.
Влад, кстати, в первую очередь, так сказать, художественно переводил материалы с nemerle.org, которые уже были доступны на английском. Т.е. фактически знакомтл русское комьюнити с Немерле. Причем первоначальную документацию на английском по Немерле писали тоже не англичане, а поляки.
В общем выбор английского языка мне показался достаточно естественным
Перевести, конечно, можно, но поддерживать версию на двух языках сложновато.
A>Если перевод на русский будешь делать только для меня — естественно шкурка выделки не стоит. Но есть хороший шанс создать комьюнити вокруг Ela на rsdn. Много тебе фидбека от "абстрактных англоговорящих"? Если, да — не парься. Если нет — подумай над моими словами.
Ну а как определить, какое количество людей отпугивает документация на английском?
A>P.S. Я ощутил потенциал Ela + твоя скорость обновлений вдохновляют.
Ну пока можешь блог почитать. Кстати, УРЛ починили: http://blogs.msdn.com/b/vorov/
Половина книги "обще-теоретического" характера туда переедет.
Re[7]: Ela. Разработка интерпретируемого языка программирова
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, alvas, Вы писали:
ВВ>Ты понимаешь, я так вопрос не ставил. И действительно не думал, что кто-то будет читать через Гугл Транслейт. С т.з. скорости мне все равно, на каком языке писать — я много лет писал техническую документацию на английском. Если бы на русском я бы смог писать книгу, скажем, в два раза быстрее, то тут вопроса бы не возникло. ВВ>Влад, кстати, в первую очередь, так сказать, художественно переводил материалы с nemerle.org, которые уже были доступны на английском. Т.е. фактически знакомтл русское комьюнити с Немерле. Причем первоначальную документацию на английском по Немерле писали тоже не англичане, а поляки. ВВ>В общем выбор английского языка мне показался достаточно естественным
И не только тебе. И полякам тоже. И кто в конце концов занимается разработкой N? Абстрактные англоговорящие?
ВВ>Перевести, конечно, можно, но поддерживать версию на двух языках сложновато.
Если не сложно сделай первую версию перевода. А там как пойдет.
A>>Если перевод на русский будешь делать только для меня — естественно шкурка выделки не стоит. Но есть хороший шанс создать комьюнити вокруг Ela на rsdn. Много тебе фидбека от "абстрактных англоговорящих"? Если, да — не парься. Если нет — подумай над моими словами.
ВВ>Ну а как определить, какое количество людей отпугивает документация на английском?
A>>P.S. Я ощутил потенциал Ela + твоя скорость обновлений вдохновляют.
ВВ>Ну пока можешь блог почитать. Кстати, УРЛ починили: http://blogs.msdn.com/b/vorov/ ВВ>Половина книги "обще-теоретического" характера туда переедет.
Здравствуйте, Воронков Василий Владимирович, Вы писали:
ВВВ>Итак, было уже немало сказано о преимуществах динамически-типизированных языков
Что то я так и не понял в чем преимущество? Есть вывод типов, есть структурные типы, зачем нужна динамика?