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

9

Что касается программирования на JavaScript, я заметил, что все, что можно сделать с помощью операторов, а блоки можно сделать только с помощью выражений. Может ли язык программирования нормально работать только с выражениями? И если да, то почему вообще используются заявления?

MaiaVictor
источник
2
Да, существует множество языков "все есть выражение", таких как Ruby и все диалекты Lisp.
Амара
@ sparkleshy Я вижу, просто предположение: у них всех есть оператор, аналог запятой JavaScript (он выполняет два оператора и возвращает значение последнего)? Это вообще решение для выполнения двух операторов в последовательности? Думаю, я считаю прогл CL аналогом, даже если он работает для> 2 выражений.
MaiaVictor
1
Все-это-выражение не должно выглядеть иначе, чем обычный язык операторов, операторы просто ... имеют значения. Если вы сделали выражения выражений javascript, весь существующий код был бы полностью действительным.
Амара
1
CoffeeScript - это язык «все для выражения», который компилируется в JavaScript.
Спойк
1
связанный (возможно, дубликат): какая полезная выразительность будет невозможна в языке, где выражение не является выражением? «Почему так много грамматик делают различие между expr и stmt, когда, как отмечено в ответах, это не имеет смысла».
комнат

Ответы:

14

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

Более радикальный, но значимый способ сделать это состоит в том, чтобы спроектировать язык так, чтобы почти все имело осмысленное значение, и использовать его таким образом, чтобы вы почти всегда использовали выражение для этого значимого значения, а не для других эффектов. Это делают языки функционального программирования (в некоторой степени; например, в Haskell есть объявления, которые не являются выражениями).

Утверждения используются, потому что в императивной парадигме есть много общих операций, которые не имеют полезного значения результата, и потому что понятие последовательных инструкций (а не вычислений) вполне соответствует этой парадигме. Если большой процент вашей программы изменяет состояние, а не вычисляет новые значения, не имеет смысла требовать создания значения (каков результат цикла for?). Напротив, когда вся ваша парадигма (FP) построена вокруг вычисления значений, выбросы, у которых нет значения результата, не требуют исключения: вместо этого вы даете им результат дозорного, который ничего не значит.


источник
-1 это не совсем так
амара
3
@sparkleshy Какая часть не соответствует действительности и как?
1
Первый абзац: вы сомневаетесь в том, что операторы имеют полезные возвращаемые значения (но многие это делают), предлагаете некрасивую вещь (почему?). Второй абзац: объявляет, что все функциональные языки программирования используют эту уродливую концепцию, которая нелепа. третий абзац: false, у нас уже есть то, что в блоках {} значение игнорируется, и это не вызывает никаких проблем, неверно; вы уже даете им отсутствие значения void, как ноль может быть менее значимым, чем это? в целом: это не совсем так
amara
2
@sparkleshy - ни один оператор не имеет полезных возвращаемых значений, поэтому он является оператором . У них могут быть полезные побочные эффекты (например, назначение), но это не одно и то же. Это на самом деле не крайняя концепция. Это хорошо известно, если не совсем практично, если взять N-й степени. И это значение часового не является нулевым или пустым, это единица, которая слегка отличается от обоих. +1 для Делнана, чтобы восполнить это.
Теластин
4
@sparkleshy (1) Вы можете путать выражения (которые могут быть единственным компонентом оператора) с оператором (которые не являются выражением и не имеют значения результата). (2) Что? Любой адвокат ФП подтвердит это (и скажет, что это хорошо). Или это только часть «всего», против которой вы возражаете? (3) {} блоки - это то, о чем я говорю («понятие последовательных инструкций»). И где я могу сказать, что что-то вызывает проблемы? Разница между voidи null/ unitзаключается в том, что последние являются значениями и могут быть переданы, тогда voidкак особенность в том, что нет значения этого типа.
5

Зависит от того, как вы определяете «утверждение» и «выражение».

Очень строгое определение будет различать утверждения как «вещи, которые имеют побочные эффекты и, возможно, возвращаемое значение», и выражения как «вещи, которые имеют возвращаемые значения, но не могут иметь побочные эффекты». При таком определении ни одна значимая программа не может быть написана без хотя бы одного оператора (который должен был бы оценить выражение и вывести его возвращаемое значение) - одни только чистые выражения не могут взаимодействовать с миром вне программы. Один язык все еще может быть полностью чистым (то есть не иметь каких-либо утверждений), если нечистая часть перемещается из языка в поддерживающую экосистему (это именно то, что делает Haskell, хотя язык имеет определения и выражения) ,

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

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

tdammers
источник
+1 за комментарии о читабельности ... В конце концов, люди должны это понять ...
mattnz
1

ATL и Xtend - хорошо работающие языки программирования. Многие функциональные языки также не требуют инструкций. Итак, да, язык программирования может нормально работать без утверждений. Я думаю, что заявления на многих языках являются реликтом императивного программирования. Они все еще используются, потому что они широко известны, и в некоторых случаях они делают код более читабельным.

SpaceTrucker
источник
1

Да.

Функциональные языки (и языки единичного присваивания) все являются выражением. Примерами являются Haskal (и SISAL). Где операторы if и for возвращают значения.

Существуют и другие классы языков: простой, который приходит на ум, - это декларативные языки (я уверен, что есть много других, которые не зависят от утверждений). Этим языкам даже не нужны выражения (в том смысле, в котором вы обычно думаете). Вы заявляете, что это правда, и вы можете получить несколько результатов назад. Самый простой здесь prolog.

Мартин Йорк
источник
У Haskell есть объявления, они не являются выражениями.
Янус Троелсен