LINUX.ORG.RU

Знак присваивания

 


0

1

А мне вот интересно, есть ли языки, где используется более естественный порядок операндов присваивания? Например «Положить объект в ящик» пишется именно так, а для присваивания это наиболее подходящая метафора. Так почему в большинстве популярных языков переменная-цель пишется первой? Разве не было бы более натуральным писать что-то вроде:

a + 1 ~ a;
a + 1 => a;
a + 1 -> a;
a + 1 → a;

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

Есть ли ЯП, где именно так и пишут?

Второй вопрос: если присваивание писать всё-таки в традиционном порядке, то почему в его основе часто используется знак =, учитывая что он означает равенство, которое есть совершенно другая операция? Как думаете, какой значок эстетичнее?

a := a + 1;
a =: a + 1;
a ~ a + 1;
a <- a + 1;
a ← a + 1;
a <= a + 1;
a = a + 1;
set a [a + 1];
...

Или ещё какие-нибудь варианты?

Какие значки есть в известных вам ЯП кроме set, =:, := и = ?

★★★★★

Последнее исправление: Xenius (всего исправлений: 2)

естественный порядок операндов присваивания?

А как функции записывали в школьной математике? Разве не так:

y=x^2+5

Вполне как в языках программирования.

Aber ★★★★★
()

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

Это декларативно — ты декларируешь равенство. Сравнение — скорее операция, чем заявление. Но в целом основная причина в том, что даже := не особо прижилось и не любимо — = тупо удобнее оказалось, а уж городить что-то типа ← тем более никто не захотел. set при этом означает множество. В некоторых языках используется let, но это немного другое.

Какие значки есть в известных вам ЯП кроме set, =:, := и = ?

В хаскеле используется <- (хоть аналогия с присваиванием в условном паскале и сишке не совсем полная)

CrX ★★★
()

А переменная в конце — тупо неудобно. Нечитабильно. Как её такую глазами искать? Ведь обычно надо найти, где присвоена та или иная переменная, чтобы прочитать, какое именно значение ей присвоено. А не наоборот, выискивать глазами значение, и смотреть, какой переменной оно присвоено. Идентификатор должен быть в начале — так он виднее.

Просто возьми любой код, желательно со всякими if’ами и elif’ами вокрук переменных (в разных бранчах разные значения разным переменным) и перепиши его с именем переменной в конце. И после ифов пусть будет какое-нибудь выражение с использованием этих нескольких переменных.

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

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)

более естественный порядок операндов присваивания?

А почему b+c=a более естественный чем a=b+c? Первое читается если сложить b и с то равно a или сумма b и с равна a, второе читается, чтобы получить a нужно сложить b и с. Первый вариант как то подкоркой воспринимается как уствеждение, а второй как план действия. Да и в арифметике формулы x=y+z показывают как получить искомое x, а обратная запись y+z=x пишется как утверждение/равенство/задача. Есть и то и то и зависит от контекста. Если дело касается кода то там всегда (ну почти) присваивание это просто получить результат, при этом сем результат просто временная сущность, побочка, которую порой вовсе убрать можно и вроде никогда не утверждение. Поэтому мне кажется более естественно именно a=b+c как минимум для кода. Но чисто с личного эстетического взгляда может лучше выглядит и читается и понимается b+c=a. Но прям виду как у меня будет гореть попка когда несколько длинных имён выносят результат куда-то в право за экран. А именно он то и нужен для ориентирования в логике кода, а обычно её пытаются понять первой, а уже потом как оно работает в деталях. С другой стороны это будет вынуждать придумывать и ёмкие и краткие имена что плюс, но и минус одновременно так как ан придумывание имени переменной может уйти (да что там может уходит) больше времени чем на сам код финальный, а потом такие да тьфу и начинают совать ультраублюдсконепонятные переменные в виде сокращений случайным образом причём одних и тех же слов по разному, хехе, вплоть до просто однобуквенных что в принципе отлично для короткого когда, но если целый экран из такого состоит а не пяток/десяток строк то начинается та ещё свистопляска. Короче, всё это прикольно, но в перспективе чёт стрёмно.

LINUX-ORG-RU ★★★★★
()

Есть ли ЯП, где именно так и пишут?

да. во-первых, один какой-то древний, во-вторых один из вариантов записи ассемблера (правда, там всё равно команда mov, но сначала значение, потом адрес назначения)

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

равенство это не операция, а отношение. в завимости от языка причины использовать = разные. в Си (или откуда там это заимствовали) по глупости/ради экономии места/чтобы не пугать двоеточием и т.д., в Хаскеле в этом всё же есть определённая логика (потому что = и обозначает «definitional equality» в определённом контексте)

caryoscelus
()

взято из математики. так наглядней.

Например «Положить объект в ящик» пишется именно так, а для присваивания это наиболее подходящая метафора.

у вас действие, а традиционно записывается утверждение, навроде «x есть y плюс z», или x = y+z

alysnix ★★★
()

Плюс во многих ЯП с нормальными макросами можно запилить самому:

iex(1)> defmodule RWAssign do
...(1)>   defmacro left ~> right do
...(1)>     quote do
...(1)>       unquote(right) = unquote(left)
...(1)>     end
...(1)>   end
...(1)> end
{:module, RWAssign,
 <<70, 79, 82, 49, 0, 0, 5, 24, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 145,
   0, 0, 0, 15, 15, 69, 108, 105, 120, 105, 114, 46, 82, 87, 65, 115, 115, 105,
   103, 110, 8, 95, 95, 105, 110, 102, 111, ...>>, {:~>, 2}}
iex(2)> import RWAssign
RWAssign
iex(3)> 2 + 3 * 4 ~> x
14
iex(4)> x
14
iex(5)> [1, 2, 3] ~> [head | tail]
[1, 2, 3]
iex(6)> head
1
iex(7)> tail
[2, 3]
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)

Например «Положить объект в ящик» пишется именно так, а для присваивания это наиболее подходящая метафора.

Это какая-то странная метафора, никогда так не осмысливал присваивание. Привязать идентификатор к значению, вот так скорее. И тогда знак равенства самый естественный.

bread
()

есть ли языки, где используется более естественный порядок операндов присваивания?

Вам нужен язык фигур, геометрический чад 2D порядок в чад графическом редакторе, не ограниченный вирджин 1D строкой в вирджин текстовом редакторе, это и есть самое естественное решение.

К сожалению, МЕТАПРОГ почил в бозе, так что уповаем на https://jpaulm.github.io/fbp/

Алсо, положить объект А в ящик Б это не метафора для присваивания в том смысле в котором многие привыкли к присваиванию, как к копированию по значению (и дивятся, когда узнают что есть еще копирование по ссылке). Синтаксис и ПАРАДИГМА популярных языков способствуют этому смешению носителя информации и непосредственно самой информаций, запутывают людей, отсюда кстати корни непонимания у студентов что такое указатели в си. Вам точно нужен flow based programming, курите его до просветления и тогда ваши волосы станут гладкими и шелковистыми.

mydibyje ★★★
()

естественный порядок операндов присваивания

Естественный порядок присваивания, это похожий на математическую нотацию, так как математику в школе учат все. Что и было реализовано в алголо-подобных языках.

Psilocybe ★★★★
()

если присваивание писать всё-таки в традиционном порядке, то почему в его основе часто используется знак =, учитывая что он означает равенство

Потому что ограничен был набор символов, которые можно было набить на IBMовских перфокартах и распечать на АЦПУ во времена изобретения ФОРТРАНа.

В самом исходном фортране для =, <, ≤, ≥, ≠ использовались комбинации вроде .EQ., .LT., .LE. etc.

↑ ← были в ранних прототипах ASCII, но ушли под напором задач реального бизнеса.

vM ★★
()

«Положить объект в ящик» пишется именно так

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

:>box
vM ★★
()