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

Не проходит тест «я прогал 12 часов кряду. Могу я понять, что здесь происходит?».

i-rinat ★★★★★
()

Довольно часто просто возвращают сам объект из метода.

obj.left().forward().right().forward();

js не знаю, но вангую, что можно обойтись без eval-а.

Kuzy ★★★
()
Последнее исправление: Kuzy (всего исправлений: 1)
Ответ на: комментарий от Kuzy

возвращают сам объект из метода.

Это баян. Жеквери-стайл. Но он не обеспечивает достаточной степени сахарности


Person=function(name, lastName){
this.name=name
this.lastName=lastName
}
defineOperation(Person, "fullName", "return this.name + ' ' + this.lastName")

person1=new Person("Jack", "Smith")
person2=new Person("John", "Doe")

alert(person1.fullName)
alert(person2.fullName)
//  Jack Smith
//  John Doe

что можно обойтись без eval-а.

Можно. Я как раз, обошелся.

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

UPD А пишут ли в таком стиле сегодня?

Что значит «в таком стиле»? Если ты про использование свойств вместо функций, чтобы не писать скобки, то да, пишут. К примеру, в Ruby такое из коробки, т.к. при вызове метода скобки можно опускать, если не возникает неоднозначности, т.е. foo.bar() эквивалентно foo.bar. А вот в Javascript я такого не видел, обычно просто определяют метод.

Если ты про defineOperation, то в случае Ruby ответ тоже «да», аналог этой функции есть в стандартной библиотеке и активно используется некоторыми библиотеками.

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

Жеквери-стайл.

Ваш жквери ещё не существовал, а так уже делали.

anonymous
()

запутанный говностиль. Фу.

Eddy_Em ☆☆☆☆☆
()

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

Сегодня или не пишут на js вообще или, если нету других вариантов, берут coffeescript и не мучают себя.

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

Это потому, что освоить javascript по силам только настоящему программисту?

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

А на кофескрипте возможно провернуть такие фокусы?

кофескрипт это по сути синтаксический сахар для js, все что можно на js можно и на кофескрипте, только там никто не занимается таким мозгое**м.

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

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

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

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

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

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

Даже в википедии написано:

CoffeeScript ([’kɔ:fɪ skrɪpt]; кофи скрипт) — язык программирования, транслируемый в JavaScript. CoffeeScript добавляет синтаксический сахар в духе Ruby, Python, Haskell и Erlang для того, чтобы улучшить читаемость кода и уменьшить его размер.

То есть CoffeeScript разрабатывался не как отдельный язык а как костыль для js чтоб на нем можно было писать без рвотных позывов. А виной всему безальтернативность js в браузерах.

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

Если есть транслятор паскаля в си, значит ли это, что паскаль умеет то же самое что си?

хватит фапать на слово «транслятор» иди и сам все посмотри http://coffeescript.org/

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

Да че там смотреть, я и так вижу, что это бред. У разных языков разные выразительные возможности.

Ладно, если ты не знаешь, как на кофе пишутся геттеры, изобрази, хотя-бы, как там реализовано наследовани в стиле new

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

А вот твой пример на кофескрипте

defineOperation = (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)
alert(2.double)

И js который получается в результате

var a, defineOperation;

defineOperation = function(the_class, name, operation) {
  return 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);

alert(2..double);

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

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

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

Она исполняется после компиляции функции, при вызове этой функции, как обычно.

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

А если наоборот, из си в паскаль транслируем, по твоей «элементарной», значит, наоборот получается, что как минимум, паскаль может все, что могёт си, но не наоборот? Lol (с заглавной буквы)

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

Твое нежелание признавать очевидное доставляет, вот тебе еще пример прям с оф сайта
Нормальные посоны:

class Animal
  constructor: (@name) ->

  move: (meters) ->
    alert @name + " moved #{meters}m."

class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5

class Horse extends Animal
  move: ->
    alert "Galloping..."
    super 45

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

sam.move()
tom.move()

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

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

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

А почему там return нет? В кофескрипте что, ретурна нет вообще чтоли? И что же получается, он ретурны расставляет где захочет? Вот это сахарок! Как на этом говне вообще писать можно?

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

А почему там return нет? В кофескрипте что, ретурна нет вообще чтоли? И что же получается, он ретурны расставляет где захочет? Вот это сахарок! Как на этом говне вообще писать можно?

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

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от TDrive

на последнее выражение в функции

А если мне из функции возвращать ничего не нужно? он все равно поставит перед последним выражением? Хрен редьки не слаще.

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

А если мне из функции возвращать ничего не нужно? он все равно поставит перед последним выражением? Хрен редьки не слаще.

А теперь расскажи нам какие минусы от лишнего ретюрна, значение которого ни кто не принимает?)

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

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

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

Допустим, у меня есть функция

show=function(){alert(staff); return staff}
//она используется в другой функции
f=function(){
   if(foo) return doSmth; show(staff) 
}
\\И третья 

func=function(f){if(f()) foo;}
Твой кофе подставит ретурн в конец f перед show, в результате она вернет значение тру, а я ожидаю, что она вернет undefined, в случае неисполенения первой ветки. Это самый настоящий адЪ. В сложном коде, конечно.

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

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

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

Ты лучше ответь, почему все хомячки так панически боятся эвала, как будто собираются его прогонять в цикле миллион раз?

как будто собираются его прогонять в цикле миллион раз?

Ну а сколько раз его собираются прогонять?

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