Трурль,
Т>Возведение в степень и извлечения корня — не инфиксные операторы. А всякие "плюсы с крышечками" не бывают правоассоциативными.
Смотри:
Степень:
2^2^2 = 2^4
Извлечение корня:
В теховской нотации
$\sqrt[2]{\sqrt[3]{\sqrt[4]{x+y}}}$
В инфиксной нотации
2 sqrt 3 sqrt 4 sqrt (x+y)
Это вложенные вычисления корней. Вычисляется корень четвёртой степени от x, потом корень третьей степени от результата, потом квадратный корень от последнего результата.
"Плюс с крышечкой" — оператор определяемый человеком, и смысл (и ассоциативность с приоритетом) целиком определяется им.
Lazy Cjow Rhrr,
LCR>Наконец, если вы пользовались калькулятором MK51, то наверное отметите тот простой факт, что тот способ вычисления (+ 3 4) требует привыкания, но оказывается очень мощным.
Я чуть запамятовал . Способ вычисления там наоборот (3 4 +)
(a+b)/(c+d) вычисляется так:
a ^ b + c ^ d + /
^ — это кнопочка специальная, "в" со стрелкой, означает конец ввода текущего числа и проталкивание его в стек.
AVC,
AVC>Честно говоря, о возведении в степень я не подумал. Поэтому Ваш аргумент мне понравился.
AVC>Из известных мне (в прежние времена ) ЯП, оператор возведения в степень присутствует в Алголе-60 и Фортране. AVC>Правда, вот незадача — в обоих случаях он левоассоциативен.
Ну а в Перле, например, ассоциативен справа. И в математике я не сталкивался с ассоциативностью слева. Более того, есть выражения, которые вообще теряют смысл, если ассоциативность возведения в степень будет левой.
LCR>>
LCR>>a =: % *: 10 myop 20
LCR>>
AVC>Скажу прямо — упрощенное Вами выражение я разобрать не смог (что, конечно, еще не аргумент).
Ну разумеется, подготовка нужна . *: (звёздочка и следом двоеточие) — это возведение в квадрат. А просто звёздочка — это умножение.
AVC> "%" — получение обратной величины.
Ваша догадка абсолютно верна. Бинарный % — это деление, а унарный — взятие обратной величины.
AVC>Насколько я понимаю, Вы предлагаете программисту самолично построить и линеаризовать в префиксном порядке синтаксическое дерево. AVC>По видимому, дальше Вы предложите и код сгенерить вручную?
Оч. смешно
Я немножко ошибся, там порядок постфиксный. Опять же повторюсь, при соответствующем навыке линеаризация делается автоматически. И вложенность скобок не нужно помнить (вы ведь наверняка видели калькулятор со скобками?).
Потом я всё же предпочитаю двигаться в обратном направлении — к абстракциям более высокого уровня. Но понимаете, к этим абстракциям не подобраться, если нижележащие абстракции будут слишком сложны.
AVC>Создается впечатление, что простоту каждый понимает по своему. AVC>Что "функциональщику" просто, то "императивщику" — ночной кошмар.
В некоторой степени вы правы. Скотт Мейерс в своей книжке про STL писал об одном примере. Я сейчас точно его не приведу (книжки рядом нет), но там строился нужный функтор из композиции других маленьких функторов. Вложенность и количество было весьма большим. Потом он показывал этот пример разным людям. Те, кто имел основательный опыт программирования на ФЯ даже и ухом не повёл. Императивщики же приходили в ужас и падали в обморок.
Вроде речь шла о математике. А математики не пишут "2^2" и тем более "2 sqrt 3".
LCR>"Плюс с крышечкой" — оператор определяемый человеком, и смысл (и ассоциативность с приоритетом) целиком определяется им.
Опять же, в математике не принято определять право(да и лево)ассоциативные операции.
Трурль,
Т>Вроде речь шла о математике. А математики не пишут "2^2" и тем более "2 sqrt 3".
Да, верно. Степень пишут со сдвигом вверх, а корень обозначают причудливым значком. Тем не менее, это по-прежнему инфиксные операторы. Я написал "^" и "sqrt" просто потому, что изобразительные возможности редактора форума малы, а открывать ТеХ и выдирать картинки мне было лень. Тем более, что в свете оригинального спора про операторы в АПЛ-подобных языках это явное излишество.
Т>Опять же, в математике не принято определять право(да и лево)ассоциативные операции.
Тем не менее это делают Хотя чаще просто определяют отображение F: XxY->Z, здесь ты скорее прав.
Здравствуйте, Трурль, Вы писали:
Т>Опять же, в математике не принято определять право(да и лево)ассоциативные операции.
Небольшое уточнение: приоритеты и ассоциативность операций вводят не в формальную систему, а только для удобства нотации. Все со времен школы помнят соглашение о приоритете умножения над сложением; для лямбда-термов lambda x y z . expr = lambda x. lambda y. lambda z . expr = lambda x.( lambda y. ( lambda z . expr ) ), т.е. на бумаге правая ассоциативность есть, в лямбда исчислении — нет.
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 ) ), т.е. на бумаге правая ассоциативность есть, в лямбда исчислении — нет.
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>Согласен.
Так в случае с бинарной операцией # то же самое. Математически исследуются свойства выражений, в которых все скобки расставлены и неоднозначностей нет.
Глеб,
PA>А вот здесь нет. Неявные скобки не нужны в формальной системе. Правила расстановки неявных скобок — они только для удобства чтения, это синтаксический сахар. Посмотрите на AST выражения в любом языке программирования — по нему невозможно определить, были скобки или нет.
Да, невозможно, однако читай дальше... (можно на ты?)
PA>Точно также ни к чему вводить в теорию ассоциативности операций, если можно построить теорию, в которой разрешены только однозначные выражения, а затем добавить правила преобразования удобных для чтения выражений к допустимой форме.
PA>...Так в случае с бинарной операцией # то же самое. Математически исследуются свойства выражений, в которых все скобки расставлены и неоднозначностей нет.
Проблема в том, что если # неассоциативна, то выражение a#b#c неоднозначно. Есть 2 пути:
1. Везде требовать правильной расстановки скобок, а выражение a#b#c объявить инвалидным.
2. Объявить, что # является право- или левоассоциативной, тогда a#b#c будет пониматься однозначно.
Я только написал про второй способ работы с бесскобочным a#b#c. Ты говоришь, что можно выбрать первый способ, и он предпочтительнее (как я понял фразу "...если можно построить теорию, в которой разрешены только однозначные выражения").
Да, можно выбрать первый способ. А вот предпочтительность наверное лучше выяснять в каждом конкретном случае отдельно, как мне думается...
Здравствуй, 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: ф.с. на то и формальная, что правила вывода — механистические, им не нужно удобство чтения.
Начинаю повторяться, посему закругляюсь.
Я думаю, мы в основном пришли к консенсусу, только с разных сторон у него стоим .