LINUX.ORG.RU

сделать свои числа в js

 ,


0

1

Скажите, как можно добавить к своему классу совместимость с математическими операторами? Например, я хочу запилить класс «точка» и добавить возможность складывать и вычитать точки используя операторы «+» и "-". Как это сделать?

UPD

я о подобной перегрузке операторов, а не об онанизме

function Point(x,y){
  this.x = x
  this.y = y
  this.toString = function(){
    return '<' + this.x + ' ' + this.y + '>'
  }
}

// хочу чтоб

var a = new Point(1,2) + new Point(2,3)
alert(a.toString()) // это должно выводить '<3 5>'

★★★★★

Последнее исправление: CYB3R (всего исправлений: 2)
Ответ на: комментарий от Dantix

Тоска. Я думал этот просто обертки над методами, как в питоне, где дергаются __add__, __sub__ и т.д.

Aswed ★★★★★
() автор топика

А если как-то так:


Dot=function(value){
  var n=new Number(value)
  n.value=Dot.mk(value)
  return n
}
Dot.mk=function(value){var s="", c=0; while((c++)<value) s+="."; return s}

dot3=new Dot(3)

console.log(
   dot3.value, dot3+1, dot3+dot3
)
// ... 4 6

regexp_regexp
()

А вообще, проблема из пальца высосана. Определи арифметические операции как ф-ци, и верти ими как хочешь. Их много что-ли?

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

add=function(){return [].reduce.call(arguments, function(x,y){return x+y})}

mkOperation=function(operator){
   return Function("return [].reduce.call(arguments, function(x, y){return x"+operator+"y})")}

add=mkOperation("+")
mul=mkOperation("*")
div=mkOperation("/")

console.log(
   mul(2,5), add(3,4,5), div(10, 2)
)
// 10 12 5

нетрудно сделать это.

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

Можно не только функции, но даже регекпы так на ходу компилить, прямо в рантайме. Очень мощное средство. Где то лисповские макросы напоминает даже.

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

Я вообще не об этом. Я вот про что

function Point(x,y){
  this.x = x
  thix.y = y
  this.toString = function(){
    return '<' + this.x + ' ' + this.y + '>'
  }
}

// хочу чтоб

var a = new Point(1,2) + new Point(2,3)
alert(a.toString()) // это должно выводить '<3 5>'

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

Да ладно, просто сделать кастомный загрузчик кода, который будет проходить по файлу и менять плюсы на .plus(XX) (и т.д.) и потом eval-ить результат. Делов на пару дней, если парсер готовый найти.

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

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


Point=function(x, y){
  this.x=x
  this.y=y
}
Point.prototype.toString=function(){return "<"+this.x+" "+this.y+">"}
Point.prototype["+"]=function(o){var first=this.x+o.x, second=this.y+o.y; return new Point(first, second)}

print(
 (new Point(1,2)["+"](new Point(3,4))).toString())

//  <4 6>

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

а не про мощность сахарка какого-нибудь недожабы, типа питона

Это не сахар, это хуки в разные части языка и рантайма. Чисел, например, существует огромное множество, должны ли создатели языка реализовать их все? особенно с учетом того, что пользователям могут потребоваться собственные, до этого неизвестные типы чисел? Удобно ли пользователям будет использовать add, sub, mul, etc для чисел, вместо привычных +, -, *? Про это и многое другое слушать Стила в growing a language.

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

Вот я и говорю, что в языке ориентированном на секретарш, это не удобно, ибо секретарша не понимает, что + и sum — суть одно и тоже. Хотя синтаксис — это зло.

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

Хотя синтаксис — это зло.

Это я про то, что, если бы арифметические операторы в JS, например, изначально были реализованы как простые ф-ции, было бы проще расширять их. Но увы.

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

это для того, чтобы спарсить все плюсы в исходнике тебе надо 2 дня искать готовый парсер? LOL

Ну 2 дня это оптимистичная оценка, может и дольше занять.

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

что + и sum — суть одно и тоже

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

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

Для варианта, который выше


Point=function(x, y){
  this.x=x
  this.y=y
}
Point.prototype.toString=function(){return "<"+this.x+" "+this.y+">"}
Point.prototype["+"]=function(o){var first=this.x+o.x, second=this.y+o.y; return new Point(first, second)}


parse=function(str){
    eval(str.replace(/(\D)(\+)(\D)/g, "$1['$2']$3"))
}


parse('print((new Point(1,2)+(new Point(3,4))).toString())')
firstPoint=new Point(1,2)
secondPoint=new Point(3,5)
parse('print(1+2)')
parse('print(firstPoint+(secondPoint).toString())')
//  <4 6>
//  3
//  <4 7>

Да, 2 дня минимум.

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

В три раза больше печатать. Точнее даже больше, ведь еще надо ставить точку и скобочки.

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

ох-ох-ох. Давно подозревал, что я в детсаду.

В три раза больше печатать

s/sum/s/g

ведь еще надо ставить точку и скобочки.

От них можно избывиться но это уже клоунада.

Питонист печатает меньше на 3 символа где-то, засчет сраного сахара, но программа его раз в 100 больше по объему текста, и раз в 300 по потребляемой памяти, потому что это деревянный язык, который лишен гибкости.

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

Ты нормальное решение давай, с тестами, документацией, примерами использования. Прогони на исходниках крупных JS проектов, чтобы убедиться, что трансформация ничего не ломает. Что-то там нахакать по-быстрому, такое в продакшне даром не надо. Твои регэкспы даже строки не отличают от кода и будут тупо портить их. Скобки вокруг второго (new Point...) убери, так никто не пишет. Operator precedence учитывай. И тд и тп. Там много всего будет вылазить.

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

Питонист

При чем тут питонист? Если у тебя загорелось от того что твой язык хреново продуман, то указания на недостатки других языков как-то ему помогут? Сомневаюсь.

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

Скобки вокруг второго (new Point...)

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

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

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

И кто говорил вообще о суперуниверсальном синтаксисе? Изначально речь шла о трансляции. У тебя с логикой то как? Если данный парсер транслирует в валидный JS, почему он не должен работать на твоих «прожектах»? Т ычто предлагал? Синтаксис запилить? Нет. Ты предлагал трансляцию. Только ты сказал, что это очень долго. А как только ткнули тебя в эту «долготу», ты соскочил с темы.

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

Это анонiмус. Он не по жабе, а по жабоскрипту.

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

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

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

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

Мне лень писать «жабоскрипт».
Собственно, мой дорогой школьник, стыдновато для программиста не иметь четкого bullshit-синдрома.

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

Мне лень писать «жабоскрипт».

Ну так пиши JS. А на что ты тогда рассчитываешь? Что кто-то поймет твой ньюяз? Экстрасенсы в отпуске, хз, что ты там имеешь в виду. К тому же, нонсенс — когда нормальный язык приравнивают к жабе. Это все равно что употребить слово жаба вместо ЛИСП.

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

когда нормальный язык приравнивают к жабе

А ты уже вывел определение «нормального языка»? Наполеоновские амбиции.

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

Это совсем не то.

язык ориентированный на секретарш..

Ну да, ведб комплексные числа, например, нужны прежде всего им

sum и + одно и то же

Если бы хоть раз написал большое приложение, то понимал бы ценность единого имени для одной операции.

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

ценность единого имени для одной операции.

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

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

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

Если бы хоть раз написал большое приложение, то понимал бы ценность единого имени для одной операции.

а ты мне скажи, к примеру, что ты ожидаешь увидеть, какой результат, для сложения экземпляра твоего класса point с обычным числом, например? Допустим

point3=new Point(3, 3)
point3+1// = ?

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

или, допустим,

new Point(1,2) + new 3DPoint(1,2,3) // -?

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

Сообщение об ошибке, потому что такой операции не реализовано. Это единственное адекватное поведение в такой ситуации.

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

Ты же сам кукарекал об удобстве одной операции для пазных типов. В JS, например, тот же + работает в том числе и для сложения строк с числами, и с булями. И юзер вполне может сам определять операции с разными типами, а не только тупой синтаксический сахар. Если твой «единый» оператор или функция не может работать с разными типами, в чем тогда смысл этого? Если может, ты можешь делать произвольные композиции с разными типами, а так, нет никакого удобства. Короче, питон соснул как всегда, а мы видим только попаболь очередного опущенного питониста, в целом, ничего нового мы в этом треде не увидели, обычные дела.

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

Если ты опечатался и написал точка + массив, то язык должен об этом и сообщить, а не выполнять непредсказуемую хурму(если ты, конечно, заранее не определил операцию «точка+массив»). Какой-то анонимус был прав, это про тебя https://ru.wikipedia.org/wiki/Резонёрство.

юзер вполне может сам определять операции с разными типами

ну, вот определи мне оператор +, что бы я мог сложить им две точки «по-человечески» написать «а + б», а не «parse('а ах, как удобно писать весь код строкой, без подсветки синтаксиса, а потом еще и parse')»

И да, удобство это как реализован полиморфизм операторов в расте или хаскеле, а написать «что-то + чего-то = голову-ломай-что-ведь-тут-где-угодно-могло-быть-неявное-приведение-типов», это ни разу не удобно.

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

Лол. Извини, но ты опоздал со своим заявлением лет на 6. Уже вышел.

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