Re[11]: Статья Н.Вирта: взгляд из Зазеркалья
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 09.02.06 06:02
Оценка:
Трурль,

Т>Возведение в степень и извлечения корня — не инфиксные операторы. А всякие "плюсы с крышечками" не бывают правоассоциативными.


Смотри:

Степень:
2^2^2 = 2^4


Извлечение корня:
В теховской нотации
$\sqrt[2]{\sqrt[3]{\sqrt[4]{x+y}}}$

В инфиксной нотации
2 sqrt 3 sqrt 4 sqrt (x+y)

Это вложенные вычисления корней. Вычисляется корень четвёртой степени от x, потом корень третьей степени от результата, потом квадратный корень от последнего результата.

"Плюс с крышечкой" — оператор определяемый человеком, и смысл (и ассоциативность с приоритетом) целиком определяется им.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[10]: Статья Н.Вирта: взгляд из Зазеркалья
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 09.02.06 06:08
Оценка:
Lazy Cjow Rhrr,

LCR>Наконец, если вы пользовались калькулятором MK51, то наверное отметите тот простой факт, что тот способ вычисления (+ 3 4) требует привыкания, но оказывается очень мощным.


Я чуть запамятовал . Способ вычисления там наоборот (3 4 +)

(a+b)/(c+d) вычисляется так:
a ^ b + c ^ d + /

^ — это кнопочка специальная, "в" со стрелкой, означает конец ввода текущего числа и проталкивание его в стек.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[11]: Статья Н.Вирта: взгляд из Зазеркалья
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 09.02.06 06:32
Оценка: 1 (1) :)
AVC,

AVC>Честно говоря, о возведении в степень я не подумал. Поэтому Ваш аргумент мне понравился.


AVC>Из известных мне (в прежние времена ) ЯП, оператор возведения в степень присутствует в Алголе-60 и Фортране.

AVC>Правда, вот незадача — в обоих случаях он левоассоциативен.

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

LCR>>
LCR>>a =: % *: 10 myop 20
LCR>>


AVC>Скажу прямо — упрощенное Вами выражение я разобрать не смог (что, конечно, еще не аргумент).


Ну разумеется, подготовка нужна . *: (звёздочка и следом двоеточие) — это возведение в квадрат. А просто звёздочка — это умножение.

AVC> "%" — получение обратной величины.

Ваша догадка абсолютно верна. Бинарный % — это деление, а унарный — взятие обратной величины.


AVC>Насколько я понимаю, Вы предлагаете программисту самолично построить и линеаризовать в префиксном порядке синтаксическое дерево.

AVC>По видимому, дальше Вы предложите и код сгенерить вручную?

Оч. смешно
Я немножко ошибся, там порядок постфиксный. Опять же повторюсь, при соответствующем навыке линеаризация делается автоматически. И вложенность скобок не нужно помнить (вы ведь наверняка видели калькулятор со скобками?).

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

AVC>Создается впечатление, что простоту каждый понимает по своему.

AVC>Что "функциональщику" просто, то "императивщику" — ночной кошмар.

В некоторой степени вы правы. Скотт Мейерс в своей книжке про STL писал об одном примере. Я сейчас точно его не приведу (книжки рядом нет), но там строился нужный функтор из композиции других маленьких функторов. Вложенность и количество было весьма большим. Потом он показывал этот пример разным людям. Те, кто имел основательный опыт программирования на ФЯ даже и ухом не повёл. Императивщики же приходили в ужас и падали в обморок.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[12]: Статья Н.Вирта: взгляд из Зазеркалья
От: Трурль  
Дата: 09.02.06 12:22
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Степень:

LCR>
LCR>2^2^2 = 2^4
LCR>


LCR>Извлечение корня:

LCR>
LCR>В теховской нотации
LCR>$\sqrt[2]{\sqrt[3]{\sqrt[4]{x+y}}}$

LCR>В инфиксной нотации
LCR>2 sqrt 3 sqrt 4 sqrt (x+y)
LCR>


Вроде речь шла о математике. А математики не пишут "2^2" и тем более "2 sqrt 3".

LCR>"Плюс с крышечкой" — оператор определяемый человеком, и смысл (и ассоциативность с приоритетом) целиком определяется им.

Опять же, в математике не принято определять право(да и лево)ассоциативные операции.
Re[13]: Статья Н.Вирта: взгляд из Зазеркалья
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 09.02.06 12:44
Оценка:
Трурль,

Т>Вроде речь шла о математике. А математики не пишут "2^2" и тем более "2 sqrt 3".


Да, верно. Степень пишут со сдвигом вверх, а корень обозначают причудливым значком. Тем не менее, это по-прежнему инфиксные операторы. Я написал "^" и "sqrt" просто потому, что изобразительные возможности редактора форума малы, а открывать ТеХ и выдирать картинки мне было лень. Тем более, что в свете оригинального спора про операторы в АПЛ-подобных языках это явное излишество.

Т>Опять же, в математике не принято определять право(да и лево)ассоциативные операции.


Тем не менее это делают Хотя чаще просто определяют отображение F: XxY->Z, здесь ты скорее прав.

Консенсус?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[13]: Статья Н.Вирта: взгляд из Зазеркалья
От: Programmierer AG  
Дата: 09.02.06 14:33
Оценка: +1
Здравствуйте, Трурль, Вы писали:

Т>Опять же, в математике не принято определять право(да и лево)ассоциативные операции.


Небольшое уточнение: приоритеты и ассоциативность операций вводят не в формальную систему, а только для удобства нотации. Все со времен школы помнят соглашение о приоритете умножения над сложением; для лямбда-термов lambda x y z . expr = lambda x. lambda y. lambda z . expr = lambda x.( lambda y. ( lambda z . expr ) ), т.е. на бумаге правая ассоциативность есть, в лямбда исчислении — нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[14]: Статья Н.Вирта: взгляд из Зазеркалья
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 10.02.06 05:47
Оценка:
Programmierer AG,

Т>>Опять же, в математике не принято определять право(да и лево)ассоциативные операции.


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


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

Если #: X^2 -> X операция, определённая на множестве X, то ассоциативность операции # это просто свойство:
  (a # b) # c = a # (b # c)

Так вот, если операция # не обладает этим свойством, то мы должны определить, как понимать выражение
  a # b # c # d

То есть нам требуется _явно_ указать, как расставляются неявные скобки — справа или слева. Следовательно, указать, левая или правая ассоциативность нужна.

PA>... для лямбда-термов lambda x y z . expr = lambda x. lambda y. lambda z . expr = lambda x.( lambda y. ( lambda z . expr ) ), т.е. на бумаге правая ассоциативность есть, в лямбда исчислении — нет.


Согласен.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[15]: Статья Н.Вирта: взгляд из Зазеркалья
От: Programmierer AG  
Дата: 10.02.06 10:28
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:


LCR>Если #: X^2 -> X операция, определённая на множестве X, то ассоциативность операции # это просто свойство:

LCR>
LCR>  (a # b) # c = a # (b # c)
LCR>

Здесь согласен.

LCR>Так вот, если операция # не обладает этим свойством, то мы должны определить, как понимать выражение

LCR>
LCR>  a # b # c # d
LCR>

LCR>То есть нам требуется _явно_ указать, как расставляются неявные скобки — справа или слева. Следовательно, указать, левая или правая ассоциативность нужна.
А вот здесь нет. Неявные скобки не нужны в формальной системе. Правила расстановки неявных скобок — они только для удобства чтения, это синтаксический сахар. Посмотрите на AST выражения в любом языке программирования — по нему невозможно определить, были скобки или нет.
Это же математика, где всегда стараются свести задачу к известным случаям (чтобы наполнить наполовину пустой стакан, надо вылить из него воду, и задача сводится к известной задаче наполнения пустого стакана ). Точно также ни к чему вводить в теорию ассоциативности операций, если можно построить теорию, в которой разрешены только однозначные выражения, а затем добавить правила преобразования удобных для чтения выражений к допустимой форме.

PA>>... для лямбда-термов lambda x y z . expr = lambda x. lambda y. lambda z . expr = lambda x.( lambda y. ( lambda z . expr ) ), т.е. на бумаге правая ассоциативность есть, в лямбда исчислении — нет.

LCR>Согласен.

Так в случае с бинарной операцией # то же самое. Математически исследуются свойства выражений, в которых все скобки расставлены и неоднозначностей нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: Статья Н.Вирта: взгляд из Зазеркалья
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 10.02.06 12:04
Оценка:
Глеб,

PA>А вот здесь нет. Неявные скобки не нужны в формальной системе. Правила расстановки неявных скобок — они только для удобства чтения, это синтаксический сахар. Посмотрите на AST выражения в любом языке программирования — по нему невозможно определить, были скобки или нет.

Да, невозможно, однако читай дальше... (можно на ты?)

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


PA>...Так в случае с бинарной операцией # то же самое. Математически исследуются свойства выражений, в которых все скобки расставлены и неоднозначностей нет.


Проблема в том, что если # неассоциативна, то выражение a#b#c неоднозначно. Есть 2 пути:
1. Везде требовать правильной расстановки скобок, а выражение a#b#c объявить инвалидным.
2. Объявить, что # является право- или левоассоциативной, тогда a#b#c будет пониматься однозначно.

Я только написал про второй способ работы с бесскобочным a#b#c. Ты говоришь, что можно выбрать первый способ, и он предпочтительнее (как я понял фразу "...если можно построить теорию, в которой разрешены только однозначные выражения").

Да, можно выбрать первый способ. А вот предпочтительность наверное лучше выяснять в каждом конкретном случае отдельно, как мне думается...
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[17]: Статья Н.Вирта: взгляд из Зазеркалья
От: Programmierer AG  
Дата: 10.02.06 14:39
Оценка:
Здравствуй, Lazy Cjow Rhrr, Ты писал:

LCR>(можно на ты?)

Без проблем .

LCR>Проблема в том, что если # неассоциативна, то выражение a#b#c неоднозначно. Есть 2 пути:

LCR>1. Везде требовать правильной расстановки скобок, а выражение a#b#c объявить инвалидным.
LCR>2. Объявить, что # является право- или левоассоциативной, тогда a#b#c будет пониматься однозначно.
Так всегда и объявляют, вопрос лишь в том, на каком уровне это делается.

LCR>Я только написал про второй способ работы с бесскобочным a#b#c. Ты говоришь, что можно выбрать первый способ, и он предпочтительнее (как я понял фразу "...если можно построить теорию, в которой разрешены только однозначные выражения").

LCR>Да, можно выбрать первый способ.

ИМХО, первый способ не только предпочтительнее и его можно выбрать, его всегда выбирают на практике. Я не знаю языка программирования, в котором приоритеты и ассоциативность операций была частью, так сказать, ядра языка, а не разрешалась на уровне синтаксического анализа. А если мы говорим о математике и формальных системах (http://en.wikipedia.org/wiki/Formal_system):

Mathematical formal systems consist of the following:
1. A finite set of symbols which can be used for constructing formulae.
2. A grammar, i.e. a way of constructing well-formed formulae out of the symbols, such that it is possible to find a decision procedure for deciding whether a formula is a well-formed formula (wff) or not.
3. A set of axioms or axiom schemata: each axiom has to be a wff.
4. A set of inference rules.
5. A set of theorems. This set includes all the axioms, plus all wffs which can be derived from previously-derived theorems by means of rules of inference. Unlike the grammar for wffs, there is no guarantee that there will be a decision procedure for deciding whether a given wff is a theorem or not.

понятно, что чем сложнее грамматика, тем сложнее становится множество правил вывода и сложнее становится теория, поэтому просто нет смысла позволять выражения вида a#b#c: ф.с. на то и формальная, что правила вывода — механистические, им не нужно удобство чтения.

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

Я думаю, мы в основном пришли к консенсусу, только с разных сторон у него стоим .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[18]: Статья Н.Вирта: взгляд из Зазеркалья
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 13.02.06 07:46
Оценка:
Programmierer AG,

PA>Я думаю, мы в основном пришли к консенсусу, только с разных сторон у него стоим .


Да, я тоже думаю, что пришли, просто дополняем мысли друг друга.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[9]: Статья Н.Вирта: взгляд из Зазеркалья
От: Oyster Украина https://github.com/devoyster
Дата: 13.02.06 18:11
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ну вот в Comega продемонстрировали новый (для меня) подход к многозадачности.


Если уж о Comega вспомнили, то и JoCaml, с которого разработчики Comega содрали подход к реализации многозадачности.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.