[image]

[Конкурс] Транслятор языка

 
1 4 5 6 7 8 13
US Сергей-4030 #10.08.2008 22:15  @Kernel3#10.08.2008 20:58
+
-
edit
 

Сергей-4030

исключающий третье
★★
Сергей-4030>> Что должно выдаваться при таком операторе:
Сергей-4030>> print(3/2)
Сергей-4030>> - 1.5 или 1?
Kernel3> Думаю, 1.5. Речь изначально же про вещественные числа шла :)

Да, пожалуй. Поправлю тогда.
   
US Сергей-4030 #11.08.2008 19:16
+
-
edit
 

Сергей-4030

исключающий третье
★★
Кстати, ишшо. Совсем забыл - что с порядком группировки операторов? a-b-c=a-(b-c) или (a-b)-c. Сейчас у меня все идет слева направо, чтобы сохранить "интуитивный" подход, но в спецификации не указано, как надо делать.
   
+
-
edit
 

tarasv

аксакал

Я конечно не автор спеки, но если в языке a-b!=a+(-b) разработчик достоин канделябра. ;) Так что вариантов кроме слева направо ИМХО быть не может.
   
US Сергей-4030 #12.08.2008 08:06  @tarasv#12.08.2008 07:50
+
-
edit
 

Сергей-4030

исключающий третье
★★
tarasv> Я конечно не автор спеки, но если в языке a-b!=a+(-b) разработчик достоин канделябра. ;) Так что вариантов кроме слева направо ИМХО быть не может.

Для плюса-минуса - пожалуй. А, скажем, для возведения в степень как?
   
+
-
edit
 

tarasv

аксакал

Со степенью сложнее. С одной стороны - классическая математическая запись правоассоциативная. И если не изменяет склероз, в языках где есть оператор возведения в степень он правоассоциативный. А с другой стороны - что слева направо что справа налево вроде ничего фундаментального математического не нарущает. ;)
Ау коммисссссияяяя?!
   
EE Татарин #13.08.2008 17:09  @Сергей-4030#11.08.2008 19:16
+
-
edit
 

Татарин

координатор
★★★★★
Сергей-4030> Кстати, ишшо. Совсем забыл - что с порядком группировки операторов? a-b-c=a-(b-c) или (a-b)-c. Сейчас у меня все идет слева направо, чтобы сохранить "интуитивный" подход, но в спецификации не указано, как надо делать.
Cверху вниз, а затем с серединыю :)

Слева направо, конечно. Всё ОК.
   
EE Татарин #13.08.2008 17:09  @tarasv#13.08.2008 17:03
+
-
edit
 

Татарин

координатор
★★★★★
tarasv> Со степенью сложнее. С одной стороны - классическая математическая запись правоассоциативная. И если не изменяет склероз, в языках где есть оператор возведения в степень он правоассоциативный. А с другой стороны - что слева направо что справа налево вроде ничего фундаментального математического не нарущает. ;)
tarasv> Ау коммисссссияяяя?!
От степени, вроде, отказались?
   
US Сергей-4030 #13.08.2008 17:40  @Татарин#13.08.2008 17:09
+
-
edit
 

Сергей-4030

исключающий третье
★★
tarasv>> Со степенью сложнее. С одной стороны - классическая математическая запись правоассоциативная. И если не изменяет склероз, в языках где есть оператор возведения в степень он правоассоциативный. А с другой стороны - что слева направо что справа налево вроде ничего фундаментального математического не нарущает. ;)
tarasv>> Ау коммисссссияяяя?!
Татарин> От степени, вроде, отказались?

Я не понял. :) Я думал, отказались только от бесконечной точности. Сейчас у меня дела обстоят так - константы вида 1234.3234E-12B6 интерпретатор понимает, весь набор инструкций есть, плюс много еще каких инструкций. Но все числа - double, кроме целых, которые long.

PS На самом деле, я вчера доделал бесконечную арифметику. Но проблема возникает - операции примерно в 10 раз медленнее стали. :( Так что я не буду включать в релиз бесконечную арифметику, пожалуй.

PPS Я тут время от времени правлю чего-нибудь, оптимизирую, структуру программы улучшаю. Буду посылать очередные версии время от времени, прошу действительной считать последнюю версию перед приемом версии от Реконструктора. Это не есть нарушение контракта?

PPPS Давайте заменим степень с ^ на **. А то наблюдается конфликт с операцией "XOR". :) Вы не против, Реконструктор?
   
EE Татарин #13.08.2008 17:49  @Сергей-4030#13.08.2008 17:40
+
-
edit
 

Татарин

координатор
★★★★★
Сергей-4030> Я не понял. :) Я думал, отказались только от бесконечной точности. Сейчас у меня дела обстоят так - константы вида 1234.3234E-12B6 интерпретатор понимает, весь набор инструкций есть, плюс много еще каких инструкций. Но все числа - double, кроме целых, которые long.
Не помню, чтобы в спецификации были типы данных. Как их отличать?

а=3 - это я целое число или вещественное приравнял? какого типа переменная?

Сергей-4030> PPS Я тут время от времени правлю чего-нибудь, оптимизирую, структуру программы улучшаю. Буду посылать очередные версии время от времени, прошу действительной считать последнюю версию перед приемом версии от Реконструктора. Это не есть нарушение контракта?
Нет.

Сергей-4030> PPPS Давайте заменим степень с ^ на **. А то наблюдается конфликт с операцией "XOR". :) Вы не против, Реконструктор?
Воля ваша, но какой ещё "ХОR" с вещественными числами? Это такой встроенный "генератор странных чисел"? раз уж генератора случайных нет? :)
   
US Сергей-4030 #13.08.2008 18:03  @Татарин#13.08.2008 17:49
+
-
edit
 

Сергей-4030

исключающий третье
★★
Татарин> Не помню, чтобы в спецификации были типы данных. Как их отличать?
Татарин> а=3 - это я целое число или вещественное приравнял? какого типа переменная?

Их не было, это моя самодеятельность. :) В данном случае - целого, потому что точки нет после числа. А вот если вы напишете a=2/3 или a=3. то тогда будет вещественного.

Сергей-4030>> PPS Я тут время от времени правлю чего-нибудь, оптимизирую, структуру программы улучшаю. Буду посылать очередные версии время от времени, прошу действительной считать последнюю версию перед приемом версии от Реконструктора. Это не есть нарушение контракта?
Татарин> Нет.

Сергей-4030>> PPPS Давайте заменим степень с ^ на **. А то наблюдается конфликт с операцией "XOR". :) Вы не против, Реконструктор?
Татарин> Воля ваша, но какой ещё "ХОR" с вещественными числами? Это такой встроенный "генератор странных чисел"? раз уж генератора случайных нет? :)

Не, понятно, XOR - только для целых. Но мне будет прикольнее, поскольку у меня целые есть, а Реконструктору, как я понимаю - все равно.

ЗЫ Функция random() у меня есть. :) Kernel обещался не тестировать на отсутствие не определенных в спецификациях фич, так я думал, вы тоже будете не против. ;)
   
US Сергей-4030 #14.08.2008 02:40  @tarasv#13.08.2008 17:03
+
-
edit
 

Сергей-4030

исключающий третье
★★
tarasv> Со степенью сложнее. С одной стороны - классическая математическая запись правоассоциативная. И если не изменяет склероз, в языках где есть оператор возведения в степень он правоассоциативный. А с другой стороны - что слева направо что справа налево вроде ничего фундаментального математического не нарущает. ;)
tarasv> Ау коммисссссияяяя?!

Ну как же не нарушает.

(2**-2)**(-2) = 1/4**-2 = 16
2**(-2**-2) = 2 ** 1/4 = корень четвертой степени из 2.

Пожалуй, надо справа считать. Комиссия как думает?
   
EE Татарин #14.08.2008 02:56  @Сергей-4030#14.08.2008 02:40
+
-
edit
 

Татарин

координатор
★★★★★
tarasv>> Со степенью сложнее. С одной стороны - классическая математическая запись правоассоциативная. И если не изменяет склероз, в языках где есть оператор возведения в степень он правоассоциативный. А с другой стороны - что слева направо что справа налево вроде ничего фундаментального математического не нарущает. ;)
tarasv>> Ау коммисссссияяяя?!
Сергей-4030> Ну как же не нарушает.
Сергей-4030> (2**-2)**(-2) = 1/4**-2 = 16
Сергей-4030> 2**(-2**-2) = 2 ** 1/4 = корень четвертой степени из 2.
Сергей-4030> Пожалуй, надо справа считать. Комиссия как думает?
Лично я скромно думаю, что справа.

Но если Кернель или Балансер захотят слева - пусть будет слева.
Пандею, в целом, устроит любое развитие конфликта.
   
EE Татарин #14.08.2008 03:06  @Сергей-4030#13.08.2008 18:03
+
-
edit
 

Татарин

координатор
★★★★★
Татарин>> Не помню, чтобы в спецификации были типы данных. Как их отличать?
Татарин>> а=3 - это я целое число или вещественное приравнял? какого типа переменная?
Сергей-4030> Их не было, это моя самодеятельность. :) В данном случае - целого, потому что точки нет после числа. А вот если вы напишете a=2/3 или a=3. то тогда будет вещественного.
А если я напишу
а=3E-1 - то вещественного?
а=3.03Е3 - то целого?
Мне кажется это фичей, которая чревата потенциальными багами в тестах со сложными выражениями.
А поскольку я настолько офигительно суперклассный программист, что тестовые программы пишу исключительно без багов, по определению ;) , то это расширение чревато нефункциональностью. Не могу сходу сказать, какой... но вообще - может.
Всё-таки для языка предсказуемость поведения внутри - не последнее дело.

Сергей-4030> Не, понятно, XOR - только для целых.
А что будет, если поксорить вещественные?
Или вещественное и целое?

Сергей-4030> ЗЫ Функция random() у меня есть. :) Kernel обещался не тестировать на отсутствие не определенных в спецификациях фич, так я думал, вы тоже будете не против. ;)
Не против совершенно.
   
US Сергей-4030 #14.08.2008 04:15  @Татарин#14.08.2008 03:06
+
-
edit
 

Сергей-4030

исключающий третье
★★
Татарин> а=3E-1 - то вещественного?

Да. :)

Татарин> а=3.03Е3 - то целого?

Нет. %(

Татарин> Мне кажется это фичей, которая чревата потенциальными багами в тестах со сложными выражениями.

Да. :(

Татарин> А поскольку я настолько офигительно суперклассный программист, что тестовые программы пишу исключительно без багов, по определению ;) , то это расширение чревато нефункциональностью. Не могу сходу сказать, какой... но вообще - может.

Да. :( Я сознаю. Но скучно уже, чего-нибудь веселого хочется, преобразований типов, оптимизации по скорости. Проиграю - значит, проиграю. В конце концов, на штуку баков Реконструктор не захотел спорить, значит проиграю только локальный спор. ;) Вот если бы на кону стояла штука баков, я б ни на грамм не продвинулся. Но ведь не стоит, можно и похулиганить. А так - да, различные типы есть оверхед при выполнении. Подпрограммы и сопутствующие им scopes и стек передачи параметров - ишшо больший оверхед. Дополнительные операторы - оверхед "компиляции" только, к счастью, выполнение не страдает. Всякие else в условном операторе и реализация for - тоже, к счастью, только на времени "компиляции" сказывается.
А вообще, я хочу пофиксить малость архитектуру, сделать попроще и понадежнее. Сегодня поправлю и вышлю.

Татарин> Всё-таки для языка предсказуемость поведения внутри - не последнее дело.
Сергей-4030>> Не, понятно, XOR - только для целых.
Татарин> А что будет, если поксорить вещественные?
Татарин> Или вещественное и целое?

NaN, понятно. У нас есть такой NaN, что решает любые проблемы. :)
   
US Сергей-4030 #14.08.2008 04:21
+
-
edit
 

Сергей-4030

исключающий третье
★★
Бесконечная арифметика вот такая получилась:

code text
  1. {
  2.         function fact(n) {
  3.                 if(n==1)
  4.                         fact=1
  5.                 else
  6.                         fact=n*fact(n-1);
  7.         }
  8.  
  9.         n=1000;
  10.         println('fact('+n+')='+fact(n));
  11. }
  12.  
  13.  
  14. fact(1000)=
  15. 402387260077093773543702433923003985719374864210714632543799910429938512398629
  16. 020592044208486969404800479988610197196058631666872994808558901323829669944590
  17. 997424504087073759918823627727188732519779505950995276120874975462497043601418
  18. 278094646496291056393887437886487337119181045825783647849977012476632889835955
  19. 735432513185323958463075557409114262417474349347553428646576611667797396668820
  20. 291207379143853719588249808126867838374559731746136085379534524221586593201928
  21. 090878297308431392844403281231558611036976801357304216168747609675871348312025
  22. 478589320767169132448426236131412508780208000261683151027341827977704784635868
  23. 170164365024153691398281264810213092761244896359928705114964975419909342221566
  24. 832572080821333186116811553615836546984046708975602900950537616475847728421889
  25. 679646244945160765353408198901385442487984959953319101723355556602139450399736
  26. 280750137837615307127761926849034352625200015888535147331611702103968175921510
  27. 907788019393178114194545257223865541461062892187960223838971476088506276862967
  28. 146674697562911234082439208160153780889893964518263243671616762179168909779911
  29. 903754031274622289988005195444414282012187361745992642956581746628302955570299
  30. 024324153181617210465832036786906117260158783520751516284225540265170483304226
  31. 143974286933061690897968482590125458327168226458066526769958652682272807075781
  32. 391858178889652208164348344825993266043367660176999612831860788386150279465955
  33. 131156552036093988180612138558600301435694527224206344631797460594682573103790
  34. 084024432438465657245014402821885252470935190620929023136493273497565513958720
  35. 559654228749774011413346962715422845862377387538230483865688976461927383814900
  36. 140767310446640259899490222221765904339901886018566526485061799702356193897017
  37. 860040811889729918311021171229845901641921068884387121855646124960798722908519
  38. 296819372388642614839657382291123125024186649353143970137428531926649875337218
  39. 940694281434118520158014123344828015051399694290153483077644569099073152433278
  40. 288269864602789864321139083506217095002597389863554277196742822248757586765752
  41. 344220207573630569498825087968928162753848863396909959826280956121450994871701
  42. 244516461260379029309120889086942028510640182154399457156805941872748998094254
  43. 742173582401063677404595741785160829230135358081840096996372524230560855903700
  44. 624271243416909004153690105933983835777939410970027753472000000000000000000000
  45. 000000000000000000000000000000000000000000000000000000000000000000000000000000
  46. 000000000000000000000000000000000000000000000000000000000000000000000000000000
  47. 000000000000000000000000000000000000000000000000000000000000000000000000


Полезная вещь - компьютеры. :) В школьные годы были всякие задачки типа - а сколько нулей в конце 532!? А ныне - вон оно как, берешь и считаешь.

ЗЫ Но я ее уберу, потому, что долго, раз в десять как минимум дольше, чем long. :( А в отдельных случаях и в сто. ;)
   
US Сергей-4030 #14.08.2008 04:24  @Татарин#14.08.2008 02:56
+
-
edit
 

Сергей-4030

исключающий третье
★★
tarasv>>> Со степенью сложнее. С одной стороны - классическая математическая запись правоассоциативная. И если не изменяет склероз, в языках где есть оператор возведения в степень он правоассоциативный. А с другой стороны - что слева направо что справа налево вроде ничего фундаментального математического не нарущает. ;)
Татарин> tarasv>> Ау коммисссссияяяя?!
Сергей-4030>> Ну как же не нарушает.
Сергей-4030>> (2**-2)**(-2) = 1/4**-2 = 16
Сергей-4030>> 2**(-2**-2) = 2 ** 1/4 = корень четвертой степени из 2.
Сергей-4030>> Пожалуй, надо справа считать. Комиссия как думает?
Татарин> Лично я скромно думаю, что справа.
Татарин> Но если Кернель или Балансер захотят слева - пусть будет слева.
Татарин> Пандею, в целом, устроит любое развитие конфликта.

Я у себя поставлю справа, мне изменить один параметр не проблема. Реконструктор - на его усмотрение, пожалуй, коли в начальных спецификациях было не предусмотрено. Вы как думаете, товарищи комиссия?
   
US Сергей-4030 #14.08.2008 04:27
+
-
edit
 

Сергей-4030

исключающий третье
★★
А давайте еще ** пользовать вместо ^? Как там Реконструктор, согласен?
   
CA tarasv #14.08.2008 07:59  @Сергей-4030#14.08.2008 02:40
+
-
edit
 

tarasv

аксакал

tarasv>>А с другой стороны - что слева направо что справа налево вроде ничего фундаментального математического не нарущает. ;)
Сергей-4030> Ну как же не нарушает.
Сергей-4030> (2**-2)**(-2) = 1/4**-2 = 16
Сергей-4030> 2**(-2**-2) = 2 ** 1/4 = корень четвертой степени из 2.
Сергей-4030> Пожалуй, надо справа считать. Комиссия как думает?

Только я чтото под вечер никак не соображу что нарушается :( То что результаты разные так это понятно что будут разные. А в примере с вычитанием они не просто разные а один из них и неправильный потому что вычитание всегда можно заменить сложением с отрицательным числом и результат не должен поменяться тоесть a-b-c=a+(-b)+(-c) и это фундаментально. Или имеется в виду что без скобок в математической записи лесенка надстрочных символов идет вверх? Но это условность записи а не свойство операции.

Зы: я не спорю что правильно справа налево я понять хочу ;)
   
US Сергей-4030 #14.08.2008 17:50  @tarasv#14.08.2008 07:59
+
-
edit
 

Сергей-4030

исключающий третье
★★
tarasv>>>А с другой стороны - что слева направо что справа налево вроде ничего фундаментального математического не нарущает. ;)
Сергей-4030>> Ну как же не нарушает.
Сергей-4030>> (2**-2)**(-2) = 1/4**-2 = 16
Сергей-4030>> 2**(-2**-2) = 2 ** 1/4 = корень четвертой степени из 2.
Сергей-4030>> Пожалуй, надо справа считать. Комиссия как думает?
tarasv> Только я чтото под вечер никак не соображу что нарушается :( То что результаты разные так это понятно что будут разные. А в примере с вычитанием они не просто разные а один из них и неправильный потому что вычитание всегда можно заменить сложением с отрицательным числом и результат не должен поменяться тоесть a-b-c=a+(-b)+(-c) и это фундаментально. Или имеется в виду что без скобок в математической записи лесенка надстрочных символов идет вверх?

tarasv> Но это условность записи а не свойство операции.

Разговор-то не про операции, а про запись. "Неправильности" никакой нет если мы будем группировать вычитание справа налево, это только форма записи. Сейчас мы пишем a-b-c имея в виду (a-b)-c, экономя скобки в этом случае (но "проигрывая" в скобках когда нам надо записать a-(b-c)). Если будет "правая" группировка мы будем "выигрывать" в скобках, когда нам нужно записать a-(b-c), но "проигрывать", когда нужно записать (a-b)-c. Это вопросы обозначения, терминов, ничего более.
   
EE Татарин #15.08.2008 03:19
+
-
edit
 

Татарин

координатор
★★★★★
А что тут понимать, Тарас? сложение коммутативно, операция взятия степени - как-то не очень коммутативна.

Нужно коммутатор расписать, что ли? :) Это поможет проги писать?
   
US Сергей-4030 #15.08.2008 08:10
+
-
edit
 

Сергей-4030

исключающий третье
★★
Кстати, подстановки типа:

a[100*56]taa[a+b]ik = 5;

- тоже жопа хорошая. %(
   
EE Татарин #15.08.2008 13:43  @Сергей-4030#15.08.2008 08:10
+
-
edit
 

Татарин

координатор
★★★★★
Сергей-4030> Кстати, подстановки типа:
Сергей-4030> a[100*56]taa[a+b]ik = 5;
Сергей-4030> - тоже жопа хорошая. %(
А чего в этом такого?
Очевидно, что сначала вычисляются все подстановки (рекурсивно, если требуется) и лишь затем - выражение.
   
US Сергей-4030 #15.08.2008 15:59  @Татарин#15.08.2008 13:43
+
-
edit
 

Сергей-4030

исключающий третье
★★
Сергей-4030>> Кстати, подстановки типа:
Сергей-4030>> a[100*56]taa[a+b]ik = 5;
Сергей-4030>> - тоже жопа хорошая. %(
Татарин> А чего в этом такого?
Татарин> Очевидно, что сначала вычисляются все подстановки (рекурсивно, если требуется) и лишь затем - выражение.

Нет, в общем, ничего, но в моей схеме приходится делать изменения в сканере токена. Что не хотелось бы. :( Собственно, все уже сделано давно, я просто так ворчу. :)
   
US Сергей-4030 #16.08.2008 00:47
+
-
edit
 

Сергей-4030

исключающий третье
★★
Кстати, вопросик. Операторы вида:

println([1]);

вроде как вполне легальны. Тогда вопрос - а если выполнять

println([1][0]);

- что получится? Вроде как, тут зависит от имплементации, если считать, что при вычислении получается:

[1][0] -> '10' - то надо ставить 10. А если считать, что
[1][0] -> '1.00.0', то тогда ошибка.

Как мы будем решать этот вопрос?
   
EE Татарин #16.08.2008 01:28
+
-
edit
 
1 4 5 6 7 8 13

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru