Re[64]: Динамические языки и переменные в избранное  новое ответить всё   подписка   модер. 
От: Воронков Василийhttp://elalang.net
Дата: 18.03.10 17:09
Здравствуйте, Temoto, Вы писали:

ВВ>>Нет, конечно. А что есть генераторы парсеров, у которых сканеры на регекспах? Регекспы штука небыстрая вообще.

T>Тааакк... какой самый известный лексер в мире?

Какой? И почему "лексер"?

ВВ>>А ведь еще можно вспомнить, что сортировать можно по одному выражению, а выбирать по другому.

T>Да, потому что выборка и сортировка это разные вещи. Они совмещены в SQL и LINQ. Я не хочу сказать, что это плохо, что они совмещены. Я хочу сказать, что там где они не совмещены, тоже всё нормально и те же задачи решаются так же легко.

Может быть. Но как написать аналогичный код на Хаскеле ты так и не показал.

T>И меня немного смущает, что ты можешь obj.GetEven сунуть функцию, в теле которой используется this и функцию, в теле которой this не используется. То есть где-то там, в километре строк отсюда, объявлена функция, в теле которой используется this. И к какому объекту будет применён этот this — никто не знает. Лично меня это очень сильно расстраивает в жаваскрипте.


Мне вообще казалось, что эта фича. Ты одну и ту же функцию можешь использовать как член различных объектов и она будет работать по-разному. А какие могут быть с этим проблемы? Неочевидно?
Ну так вроде динамика же, "позднее связывание" c this, так сказать.

T>В C# эта проблема решена тем, что методы нельзя объявлять вне скопа класса, поэтому всем понятно что значит this. А тут будет непонятно. Как в жаваскрипте.


Нельзя, но смысл "this" все равно может отличаться. Объектно-ориентированный же язык. При желании можно даже извернуться, что this будет null.
У меня если ф-ция не вызывается как член объекта, то this == null.

В ДжаваСкрипте же все совсем по-другому, там другой this. this — это просто создание/обращение к особой переменной внутри замыкания, к которой можно обращаться в извне. Вообще любой объект в ДжаваСкрипте — это функция.

function Foo(param)
{
  this.x = param;
}

var f = new Foo(12);
alert(f.x);


ЗЫ. Кстати, я тут переделал грамматику, теперь все является expression. Можно писать всякую хрень вида:

var x = (if (true) 12 else 24) + 12;
Ela 0.9 Dynamic, functional, strict and lazy