LINUX.ORG.RU

Выражение и инструкции

 , ,


1

1

Навеяно обсуждением новой версии компилятора D в новостях.

Начался спор, как я понял, с вопроса о нужности явного ретурна, но мне кажется, что это лишь следствие более общего(и интересного) вопроса: «разделять ли при проектировании ЯП понятия выражение и инструкция или же считать все выражением?».


Ты это statement «инструкцией» обозвал?!?

anonymous ()
Ответ на: комментарий от anonymous

Неожиданный поворот спора=)

О терминах спорить не очень хочется, честно говоря. Да, имелся в виду statement(и expression для выражения, соответственно).

forCe ()
Ответ на: комментарий от forCe

Срач «algol vs. Fortran» глуп и бесперспективен.

anonymous ()

Инструкции вносят сложность и неоднозначность и должны быть сведены к минимуму.

loz ★★★★★ ()

В императивных языках — да, имеет смысл сделать специальный синтаксис для упорядоченной последовательности вычислений.

В декларативных логичнее использовать подход с выражениями.

/thread

ilammy ★★★ ()
Ответ на: комментарий от ilammy

зачем в императивных-то? Императивные скала, руби, раст вполне живут с выражениями и никто не жалуется

anonymous ()
Ответ на: комментарий от ilammy

имеет смысл сделать специальный синтаксис для упорядоченной последовательности вычислений.

Что мешает указать, что последовательность выражений в блоке выражений выполняется в порядке следования?

forCe ()
Ответ на: комментарий от anonymous

Императивные скала, руби, раст вполне живут с выражениями и никто не жалуется

а если в Скале — написать выражение и затем поставить точку-с-запятой — то в результате мы получаем инструкцию..

так ведь?

user_id_68054 ★★★★★ ()

мне кажется, что это лишь следствие более общего(и интересного) вопроса: «разделять ли при проектировании ЯП понятия выражение и инструкция или же считать все выражением?».

Именно так. Возможность не ставить return - это одно из следствий выбора второго варианта.

tailgunner ★★★★★ ()

Инструкции не нужны, как и return.

fmap ()
Ответ на: комментарий от fmap

не нужны[...] return.

но если убрать из языка ``return`` — то как же тогда заставить программиста библиотеки — не забывать каждый раз писать слово ``nil`` перед концом функции? :-)

[в случаях когда функция обозначает действие, а не запрос информации]

user_id_68054 ★★★★★ ()
Ответ на: комментарий от user_id_68054

``nil`` перед концом функции?

Никак не забывать. «Перед концом» «функции» и так будет выражение которое «возвращает» ``nil``.

fmap ()
Ответ на: комментарий от fmap

но ведь тогда если был бы такой язык программирования — то тогда был бы огромный риск возникновения следующей ситуации:

(пишу фрагмент кода на импровизированном гипотетическом языке)

допустим есть некоторая функция в библиотеке:

require 'low_level_some'

def do_super_some(v)
    if v => 1000
        do_big_some(v)
    else
        do_small_some(v)
    end
end

как видим — программист библиотеки здесь забыл указать ``nil`` перед концом функции ``do_super_some()``

но допустим — это не страшно, так как ``do_big_some()`` всегда возвращает ``nil``, и ``do_small_some()`` тоже всегда возвращает ``nil``.

а теперь представим что неожиданно ``do_big_some()`` начинает возвращать в случае успеха что-то другое [допустим это случается после — после pacman -Syu # :)]

....и в результате — функция ``do_super_some()`` начинает возвращать непонятную почти-безсистемную ерунду..

а другой программист — позже может подумать что ``do_super_some()`` возвращает не безсистемную ерунду, а вполне определённое «успех если != nil».. и вот он баг на ровном месте!

:-( :-(

user_id_68054 ★★★★★ ()
Последнее исправление: user_id_68054 (всего исправлений: 2)
Ответ на: комментарий от user_id_68054

как видим — программист библиотеки здесь забыл указать ``nil`` перед концом функции ``do_super_some()``

Oh no, not this shit again.

tailgunner ★★★★★ ()
Ответ на: комментарий от user_id_68054

и вот он баг на ровном месте!

И где же тут баг? Вывод типов тебе в помощь. А при динамической типизации на это вообще насрать.

korvin_ ★★★★★ ()
Ответ на: комментарий от korvin_

И где же тут баг? Вывод типов тебе в помощь.

да. вывод типов — спас бы.

user_id_68054 ★★★★★ ()
Ответ на: комментарий от user_id_68054

а теперь представим что неожиданно ``do_big_some()`` начинает возвращать в случае успеха что-то другое [допустим это случается после — после pacman -Syu # :)]

nil — всего лишь константа, такая же как и ноль (<type 'int'>). Можно подставить ноль на место nil, или лучше строку «pony.org.ru», чтобы увидеть что return тут не причем.

fmap ()
Ответ на: комментарий от fmap

Я когда на перле писал, тыщу раз вместо планируемого андефа ловил последнее вычисление в редкой елсе-ветке. Теперь привычка всегда писать ретурны.

arturpub ★★ ()
Ответ на: комментарий от forCe

Что мешает указать, что последовательность выражений в блоке выражений выполняется в порядке следования?

Ничего. Это и есть тот самый специальный синтаксис.

ilammy ★★★ ()
Ответ на: комментарий от user_id_68054

Мифические примеры из головы такие мифические. Попиши на Руби что ле.

anonymous ()
Ответ на: комментарий от user_id_68054

если был бы такой язык программирования

Он уже есть и не один.

как видим — программист библиотеки здесь забыл указать ``nil`` перед концом функции ``do_super_some()``

Ничего он не забыл. Результатом функции будет результат if'а, результатом которого в данном случае будет или do_big_some(v) или do_small_some(v). Если у if-elif'а нет ветки else, то логично считать результатом if'а в случае несоответствия всем ветвям некоторый None в динамических языках, а в языках со статической типизацией или считать весь такой if Unit'ом или же Option<тип результата ветвей>.

anonymous ()

ретурны не нужны

-module(factorial).
-export([factorial/1]).

factorial(X) when X > 0 ->
  factorial(X, 1, 1).

factorial(X, X, A) ->
  A*X;

factorial(X, N, A) ->
  factorial(X, N+1, A*N).

/thread

nanoolinux ★★★★ ()
Ответ на: комментарий от user_id_68054

начинает возвращать непонятную почти-безсистемную ерунду

Она начнет ее возвращать, только если программист идиот и под строчками его когда нет никакой человеко-понятной проблемной области.

buddhist ★★★★★ ()

Ключевое слово return, вне всяких сомнений нужно, так как оно приятно звучит на слух, несёт глубокий философский смысл (см. вечное возвращение) и вообще украшает код. Я уже не говорю о мелочах типа удобочитаемости кода и предотвращения ошибок. В связи с этим также отмечу чудовищную тенденцию по обрезанию слов (пусть и английских) в текстах программ. Так например на смену function приходят func (Go), fun (Kotlin) и даже fn (Rust). Объясните мне, зачем в современном мире нужна такая экономия на буквах? Ах да, чуть не забыл: явное разграничение function и procedure в Pascal'е было офигенным. есть ли ещё где-нибудь такой подход?

CARS ★★★★ ()
Ответ на: комментарий от CARS

fun (Kotlin) и даже fn (Rust). Объясните мне, зачем в современном мире нужна такая экономия на буквах?

Нагло своровали из ML.

fmap ()
Ответ на: комментарий от CARS

есть ли ещё где-нибудь такой подход

Вижуалбейсик же.

А на буквах экономят чтобы писать быстрее и психологический эффект от использования конструкции был иной.

PolarFox ★★★★★ ()
Ответ на: комментарий от CARS

вне всяких сомнений нужно, так как оно приятно звучит на слух, несёт глубокий философский смысл (см. вечное возвращение) и вообще украшает код.

Это аргумент, на ваш взгляд?

Я уже не говорю о мелочах типа удобочитаемости кода и предотвращения ошибок

Хороший код без ретурна читается лучше. Плохой с ретурном выглядит более приемлемо, согласен.

Объясните мне, зачем в современном мире нужна такая экономия на буквах?

Лучше читается.

Ах да, чуть не забыл: явное разграничение function и procedure в Pascal'е было офигенным.

Бессмысленным скорее. Чем вам не по душе тип Unit или его аналог?

anonymous ()
Ответ на: комментарий от anonymous

Чем вам не по душе тип Unit или его аналог?

Тем, что значения этого типа не принимаются и не возвращаются, это искусственный костыль.

unC0Rr ★★★★★ ()
Ответ на: комментарий от unC0Rr

Чем вам не по душе тип Unit или его аналог?

Тем, что значения этого типа не принимаются и не возвращаются, это искусственный костыль.

Тебе, небось, еще не по душе ноль в арифметике и пустое множество в математике?

tailgunner ★★★★★ ()
Ответ на: комментарий от unC0Rr

Тем, что значения этого типа не принимаются и не возвращаются, это искусственный костыль.

Принимай и возвращай, кто мешает?

korvin_ ★★★★★ ()
Ответ на: комментарий от tailgunner

Ноль - это число, а не отсутствие числа. Когда пишут void a(void) - возвращаемое значение отсутствует, а не равно некоему нулю.

unC0Rr ★★★★★ ()
Ответ на: комментарий от unC0Rr

В сишечке есть инструкции, поэтому там можно и так. А мы тут вроде о языках, где все выражение. Там Unit является полноправным типом.

anonymous ()
Ответ на: комментарий от CARS

есть ли ещё где-нибудь такой подход?

В Ada есть, причём функции могут иметь только входные, но не выходные аргументы, в отличие от процедур.

Begemoth ★★★★★ ()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

Тебе, небось, еще не по душе ноль в арифметике и пустое множество в математике?

Ноль - это число, а не отсутствие числа.

Насчет пустого множества возражений нет? Я так и думал.

Когда пишут void a(void) - возвращаемое значение отсутствует, а не равно некоему нулю.

void - это тип, у которого нет значений (ровно 0 штук).

tailgunner ★★★★★ ()
Ответ на: комментарий от ilammy

Algol совершенно императивный, если что.

anonymous ()
Ответ на: комментарий от anonymous

Попиши на Руби что ле.

а как на нём пописать-то, если там библиотек кот наплакал? (кроме web.. для web — там много всего, кажется)

user_id_68054 ★★★★★ ()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

Так много звёзд, а такой тупой, а.

anonymous ()

Нет ни одного вменяемого аргумента за инструкции. Не зря и в новых языках почти всегда только выражения.

anonymous ()
Ответ на: комментарий от korvin_

А зачем? Ведь это бессмысленно? Ради чего заводить полноценный отдельный тип? Ради экономии нескольких символов?

anonymous ()
Ответ на: комментарий от loz

Инструкции вносят сложность

В чем? Наоборот, для разных понятий(вычислимое выражение и выполнение действий) используются разные подходы. Это упрощает понимание.

и неоднозначность

Где же там неоднозначность?

anonymous ()
Ответ на: комментарий от fmap

Инструкции не нужны, как и return.

Инструкции - это команды для выполнения. Как они могут быть не нужны абстрактному исполнителю? Выражение же нужны для вычислений чего-либо во что-либо. Какой смысл смешивать эти понятия в одно?

anonymous ()
Ответ на: комментарий от nanoolinux

Напиши что-нибудь посложнее факториала.

anonymous ()
Ответ на: комментарий от tailgunner

Да хрен с ним. Но вот зачем плодить сущности без необходимости?

anonymous ()
Ответ на: комментарий от anonymous

зачем плодить сущности без необходимости?

Кстати да, зачем? Выражения в языке должны быть, функции тоже. Зачем нужны доказанно ненужные сущности вроде операторов (ты ведь операторы называешь «инструкциями», да?) и процедур?

tailgunner ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.