LINUX.ORG.RU

Стиль затаившегося ниндзя

 


0

1

defineOperation=function(the_class, name, operation){
   Object.defineProperty(the_class.prototype, name, {get: Function(operation)})
   
}
defineOperation(Number, "inc", "return this+1")
defineOperation(Number, "double", "return this+this")

a=1
a=a.inc.inc

alert(a) // 3
alert(2..double) // 4

Неплохо получается, да?

UPD А пишут ли в таком стиле сегодня? Проповедует ли его какой-нибудь мастер?



Последнее исправление: terminator-101 (всего исправлений: 7)
Ответ на: комментарий от terminator-101

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

Да, это называется программирование.) А еще нужно забивать голову значениями переменных, состояниями объектов, результатами выражений...

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

Это кофескрипт позволяет неявно возвращать значение последнего выражения функции, а в js наоборот ничего неявного нету, в твоем примере функция явно ничего не возвращает.

TDrive
()
Ответ на: комментарий от terminator-101

Конечно, если бы паскаль не мог что-то из си то твоя гипотетическая трансляция просто не получилась бы, что тут обсуждать вобще.

loz
()
Ответ на: комментарий от TDrive

Самые настоящие программисты осилившие js:

Кстати, посмотрел этот твой код с офсайта и просто ох*ел.

Animal=function(meters, style){
 var f = function(name){
   this.name=name; this.meters=meters; this.style=style
 }
 f.prototype={
  move: function(){
     alert(style); alert(this.name + " moved " + meters + "m.")
  }
 }
   return f
}

Horse=Animal(5, "Galloping...")
Snake=Animal(45, "Slithering...")

sam=new Snake("Sammy the pyton")
tom=new Horse("Tommy the Palomino")

sam.move();
tom.move();

Эти «компиляторщики» тупо джаваскрипт не знают. То есть вообще. И дело даже не в том, что они нах*чили нечитаемую глупую лапшу. Хуже то, что в это говно компилируется их говноязычок. Они вместо делегирования используют преимущественно копирование, то есть, на больших объемах будут утечки памяти. Как им бошки еще не поотрывали за такое:) И, главное, это чудо лежит на офсайте, как ни в чем не бывало. Просто Абзац.

terminator-101
() автор топика
Ответ на: комментарий от TDrive

Я тебе показал один из вариантов того, как этот юзкейс можно было реализовать. Теперь посмотри на вариант этих кофи-ниндзей. По моему, комментарии излишни. А какая еще «конкретика» тебе нужна, я хз. Кофескрипт написало говнокодерьё, которое о JS не имеет ни малейшего представления — вот это я тебе конкретно могу сказать.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Я тебе показал один из вариантов того, как этот юзкейс можно было реализовать.

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

Только вот факты остаются фактами, кофескрипт разрабатывался с целью исправить косяки js и сделать его хоть немного удобным для написания программ, а не фапанья на вывернутую через заднее место логику для реализации элементарных вещей. Судя по популярности он со своей целью вполне справляется, если там и есть какие то косяки то они исправляются. И куча людей по всему миру использует его и будет использовать, по крайней мере пока не допилят js 2.x в которой авторы стандарта поняли что 1.x получился говном и запилили нормальные классы, константы и остальные прелести нормальных яп.

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

TDrive
()
Ответ на: комментарий от TDrive

про какой

Про этот ессно:

var Animal, Horse, Snake, sam, tom,
  __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

Animal = (function() {
  function Animal(name) {
    this.name = name;
  }
  Animal.prototype.move = function(meters) {
    return alert(this.name + (" moved " + meters + "m."));
  };
  return Animal;
})();

Snake = (function(_super) {
  __extends(Snake, _super);
  function Snake() {
    return Snake.__super__.constructor.apply(this, arguments);
  }
  Snake.prototype.move = function() {
    alert("Slithering...");
    return Snake.__super__.move.call(this, 5);
  };
  return Snake;
})(Animal);

Horse = (function(_super) {
  __extends(Horse, _super);
  function Horse() {
    return Horse.__super__.constructor.apply(this, arguments);
  }
  Horse.prototype.move = function() {
    alert("Galloping...");
    return Horse.__super__.move.call(this, 45);
  };
  return Horse;
})(Animal);

sam = new Snake("Sammy the Python");
tom = new Horse("Tommy the Palomino");

sam.move();
tom.move();
terminator-101
() автор топика
Ответ на: комментарий от loz

Интересно, на какой итерации вы наконец-то определите, что подразумевается под «умеет»?

Если придерживаться твоей точки зрения, то brainfuck умеет то же, что и haskell.

Kuzy
()
Ответ на: комментарий от terminator-101

Причем касательно классов, в js слово class зарезервировано с самого начала, что как бы намекает на изначальные планы разработчиков, но видимо как то не получилось, зато появилось целое поколение фанатиков которые научились лепить из ... конфеты и доказываю всем что это единственный верный путь.

TDrive
()
Ответ на: комментарий от terminator-101

Про этот ессно:

Ну вот и напиши разработчикам кофескрипта багрепорт, они тебе спасибо скажут, а я удаляюсь, завтра вставать рано.

TDrive
()
Ответ на: комментарий от TDrive

Что не получилось? Классы реализовать? Да ты охренел чтоли? Классы подобные тем что в былляцком ООП — это засахаренные лексические замыкания. Разупорись. В JS ООП в сотни раз мощней, оно родом из селфа и смолтока.

terminator-101
() автор топика
Ответ на: комментарий от Kuzy

Интересно, на какой итерации вы наконец-то определите, что подразумевается под «умеет»?

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

terminator-101
() автор топика

Мне не нравится такой стиль. Функция вызывается без скобок, это путает читателя кода, который думает, что читается поле в хеш-таблице. Тело функции определяется в строке, это мешает IDE анализировать код и путает читателя. Также функция должна определяться через синтаксис function name, а не присваиванием анонимной функции переменной.

Вторую и третью проблему можно было бы решить, написав

function defineOperation(the_class, name, operation){
   Object.defineProperty(the_class.prototype, name, {get: operation})
}
defineOperation(Number, "inc", function() { return this + 1; })
но тогда функция defineOperation становится совсем тривиальной и от меня лично смысл её наличия ускользает, проще прямо на месте использовать Object.defineProperty, вместо ввода ненужной абстракции.

Legioner
()
Ответ на: комментарий от Legioner

Смысл в тех функциях, которые не требуют аргументов, и семантически соответствуют пропертям. Такие, например, как fullName fullSize и т.д.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

В JS ООП в сотни раз мощней, оно родом из селфа и смолтока.

ооп на прототипах только у селфа, а ооп Smalltalk в руби и с js там мало общего.

TDrive
()
Ответ на: комментарий от TDrive

что, не спится?:)

ооп Smalltalk в руби и с js там мало общего.

Это тебе так кажется. Вся фишка в динаимке. Что касается селфа - это смолток, только еще смолточней.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Это тебе так кажется. Вся фишка в динаимке. Что касается селфа - это смолток, только еще смолточней.

руби динамичнее чем js, в руби (и смолтолке) все объект в js нет, в руби можно менять все что угодно в js нельзя менять даже строки.

TDrive
()
Ответ на: комментарий от TDrive

В Js все динамически преобразуется в объект, если идет обращение как к объекту. Это, практически, то же самое, сделано это из соображений производительности. При желании, можно создавать примитивы как объекты явно, через new String, new Number. Так что, в JS тоже все есть объект. Что касается муттабельности строк, то это проблема больше демагогического, нежели практического толка.


s="foo"
s=s.replace(/f/, "m")
alert(s)
// moo

В чем проблема? Зачем они нужны?

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Я даже спорить не буду по поводу производительности, практического применения и тд, это все верно. Но это противоречит концепции смолтолка и уж точно не делает js динамичнее. Так что называть js наследником смолтолка и уж темболее ставить его в пример динамичного яп в корне не верно.

TDrive
()
Ответ на: комментарий от terminator-101

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

TDrive
()
Ответ на: комментарий от Kuzy

Ну я конечно не имею ввиду полноту по Тьюрингу, а более-менее простую трансляцию. А есть транслятор из хаскеля в брейнфак?

loz
()
Ответ на: комментарий от terminator-101

Смысл в тех функциях, которые не требуют аргументов, и семантически соответствуют пропертям. Такие, например, как fullName fullSize и т.д.

Ок, может быть. А зачем городить весь огород с отдельной функцией? Чего бы напрямую Object.defineProperty не использовать? Так хочется убрать любое повторение? Имхо, в повторениях, как таковых, проблем нет. Проблема начинается в тот момент, когда ты захочешь что-то поменять во всех этих повторениях. И где-то в итоге забудешь. Но Object.defineProperty это библиотечная функция. Она изменяться в обозримом будущем не будет и ничего менять в её вызове не нужно. Один раз написал и всё, на года. Абстрагироваться от неё = создавать лишнюю абстракцию в угоду мимолётной лени написать десяток лишних символов.

Legioner
()
Ответ на: комментарий от Legioner

Прописывая явно, мне порой, приходится не только писать но и считать. А я на это не учился. Пусть комп за меня считает.

defineOperation=function(the_class, name, operation){
   Object.defineProperty(the_class.prototype, name, {get: Function(operation)})
}

Box=function(netto){
   this.netto=netto
}
Box.prototype.packageWeight=5
defineOperation(Box, "brutto", "return this.netto+this.packageWeight")

box1=new Box(100)
box2=new Box(110)

alert(box1.brutto)
alert(box2.brutto)

//  105
//  115

terminator-101
() автор топика
Ответ на: комментарий от Kuzy

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

loz
()
Ответ на: комментарий от loz

Он умеет в «ast напрямую».

Вообще, мне лень дальше дискутировать. Почитай про абстрактный и конкретный синтаксис.

Kuzy
()
Ответ на: комментарий от Kuzy

Он умеет в «ast напрямую».

Я не вижу как это поможет ему транслировать ленивость хотябы на примере бесконечных списков.

loz
()

Ты забыл пройти индейский ритуал «НАХУА» перед тем как писать подобный код.

Aswed
()
Ответ на: комментарий от Kuzy

При чем тут компьютер, когда брейнфак не умеет этого как язык.

loz
()

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

SV0L0CH
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.