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
() автор топика
Ответ на: комментарий от loz

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

define простую

А есть транслятор из хаскеля в брейнфак?

Можешь попробовать Haskell -> GHC c-- -> http://esolangs.org/wiki/C2BF

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

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

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

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

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

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

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

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

loz ★★★★★
()

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

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

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

loz ★★★★★
()

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

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