Обновить
4
Олег@playermet

Программист

0,2
Рейтинг
3
Подписчики
Отправить сообщение

Напишите пожалуйся “устоявшееся” определения, чем же, по вашему, «Expression» принципиально отличается от «Statement»

Ну например.
Для statement: "syntactic unit of an imperative programming language that expresses some action to be carried out".
Для expression: "a sequence of operators and operands, that specifies a computation".

Можете привести примеры этих statement?

stmt if expr
stmt unless expr
stmt while expr
stmt until expr
stmt rescue expr
var = method expr
x,y = expr

Давайте, пожалуйста, не будем притягивать за уши лишние сущности, и сперва определимся, чем же «Expression» принципиально отличается от «Statement», а потом уже посмотрим, что есть в LISP, а чего нет.

Какие конкретно сущности являются лишними? Статья была посвящена терминам statement и expression, разделение которых продиктовано синтаксическими нюансами императивных ЯП, например банальным нежеланием разрешать и как-то обрабатывать конструкции вроде "print(return)", "if(break)", "while(import)" и т.п. Теперь вы приводите в пример LISP, в грамматике которого вообще не прописано ни statement, ни expression в значениях аналогичных императивным языкам.

Ведь я и пишу о том, что жесткое разделение на stmt и expr, это только дань привычке

Настолько же дань привычке, как использование латиницы в ключевых словах, организация кода по строкам с выполнением сверху вниз, позиционной десятиричной системы счисления. Можно ли сделать язык с египетскими иероглифами, выполнением по спирали на сетке против часовой стрелки и римскими числами? Можно. Является ли "дань привычке" основной причиной почему так не делают? Сомнительно.

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

Это детали реализации грамматики, которые разработчики реализовали именно таким образом

Так про что угодно можно сказать. Все ЯП это формальные системы, в которых если захотеть можно букве имени класса номер строки в исходниках присвоить. Но это не значит что можно перечеркнуть все устоявшиеся определения.

В одном случае это будут одни правила, а в другом - другие. Просто разработчики написали их именно так и нетерминал в парсере назвали stmt, а в другом языке нетерминал грамматики взяли и назвали stmt_or_expr, но что в итоге доказывает или объясняет?

Так уж случилось, что есть сотни императивных языков программирования, в которых отдельно stmt, отдельно expr, и назвать их можно как уходно, хоть a и b, но это две отдельные сущности, которые соотносятся определенным образом, и это не только деталь реализации, но и прописанная в документациях особенность. И так уж случилось, что нет языков, в которых есть один терминал названный stmt_or_expr, либо это две отдельные сущности, либо одной из них просто нет. Определения нужны, чтобы люди могли одинаково понимать о чем идет речь, когда слышат конкретное слово, и обычно они отражают конкретную сложившуюся по факту действительность. И она сложилась именно вот так.

Тем более, что речь изначально шла про Ruby, в котором это разделение такое же явное, как и в С/С++/Java. Т.е. прямо указано, что некоторые statement не являются expression, и использование их там, где ожидается expression является синтаксической ошибкой.

LISP, это не академический язык, в котором все является выражением и вся программа состоит тоже только из выражений.

LISP это не императивный язык, в нем программа это список атомов, а не последовательность строк/команд. В нем просто нет statement как сущности, и это не то же самое что тождественность stmt и expr. При этом он вполне академический.

Если ордера нет и они пришли просто пообщаться, то могут разворачиваться и идти в пешее эротическое

Советы категории "лучший способ успокоить мужчину: - да что ты истеришь как баба!".

Тогда по вашему выходит, что “expression” не может содержать инструкции?

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

в чем тогда между ними различие?

Отличие в том, что из последовательности statement состоит вся программа, а expression это лишь одна из подкатегорий statement в некоторых языках, кроме которой существуют множество других.

Общепринятое определение, это “statement” не возвращает значения

Источник можно? В англоязычной википедии например используется "statement is a syntactic unit of an imperative programming language that expresses some action to be carried out", в русскоязычной "наименьшая автономная часть языка программирования ... Программа обычно представляет собой последовательность инструкций". И примерно то же самое написано во всех учебниках.

При этом каждое expression в Ruby буквально включено в statement. Это отражено как в его правилах грамматики: stmt : expr, так и в документации, что можно заметить по цитате выше: "statements that are not expressions ...". И Ruby в этом не одинок, в тех же C и C++ это тоже верно.

Что вы имеете ввиду под “statements” ?

Имею ввиду общеиспользуемое их определение, которое в том числе применяется в официальной документации Ruby.

но их нельзя использовать по отдельности вне определенного контекста

Как и все другие в языке кроме корневого, с которого начинается парсинг.

А вот еще такой пример из документации:

However, when used as a modifier, if, else, while, until and rescue are statements but not expressions.

Statements that are not expressions cannot be used in contexts where an expression is expected, such as method arguments.

puts( 1 if true ) #=> SyntaxError

В Ruby есть явное разделения на statement и expression, и в официальной документации подписано что есть что. Например: break, next и redo это statements.

А вот грамматические правила для statements в Ruby, это очень старая версия, от 2004 года, но тем не менее. Видно что есть stmt, а есть expr и expr_value.

stmt        : kALIAS fitem  fitem
            | kALIAS tGVAR tGVAR
            | kALIAS tGVAR tBACK_REF
            | kALIAS tGVAR tNTH_REF
            | kUNDEF undef_list
            | stmt kIF_MOD expr_value
            | stmt kUNLESS_MOD expr_value
            | stmt kWHILE_MOD expr_value
            | stmt kUNTIL_MOD expr_value
            | stmt kRESCUE_MOD stmt
            | klBEGIN ‘{’ compstmt ‘}’
            | klEND ‘{’ compstmt ‘}’
            | lhs ‘=’ command_call
            | mlhs ‘=’ command_call
            | var_lhs tOP_ASGN command_call
            | primary_value ‘[’ aref_args ‘]’ tOP_ASGN command_call
            | primary_value ‘.’ tIDENTIFIER tOP_ASGN command_call
            | primary_value ‘.’ tCONSTANT tOP_ASGN command_call
            | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
            | backref tOP_ASGN command_call
            | lhs '=' mrhs_basic
            | mlhs '=' mrhs
            | expr

- Ваш дизайн - говно.

- Это дизайн говна.

- Тогда недурно.

Генеративный ИИ сделал программный код дешёвым

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

У кого как. Месяц назад примерно статья была, где человек сравнивал GLM 5.2 и Opus 4.8. Результаты были такие:

Да, этот вопрос задал пользователь реддита Diligent_Ad_6530. Вопрос получил тысячи лайков.

На самой странице текстом подписано: "Красный бейдж скидки и зелёный «в наличии» слились в одинаковый грязно-жёлтый. Выбор цвета рюкзака — красный и зелёный кружки — теперь неразличимы.".

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

Смысл в том, что в С++ всё красиво и аккуратно, не каких лишних букв и символ.

Серьезно? С++ один из самых ругаемых языков за непонятную мешанину из спецсимволов.

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

С++ это набор запчастей, из которых можно собрать ржавое ведро, а можно самолет в цветах Феррари. Зависит от того, что набрать, а что выкинуть.

Который, как правило, не подходит для серьёзных применений.

Более 99.9% всего кода не является "серъезным" в принципе. Да и речь же не идет о том, чтобы удалить специфичные версии. Речь о том, что должен быть удобный дефолт, а дальше уже можно делать конкретные библиотечные вариации. Сениор разберется, где ему не подходит дефолт. Джуниору никакого прока от этих специнструментов, он понятия не имееет ради чего его заставляют весь этот бойлерплейт писать.

Под Новый Год моей бабушке родственник отправил одно короткое СМС с поздравлением. После чего оно повторно приходило еще недели две или три, в случайное время суток, в общем количестве несколько десятков раз. Такое вот отсутствие проблем с СМС.

Только если этот браузер переделать в ОС. Должен же кто-то заниматься файловой системой, менеджментом памяти, управлением процессами и потоками, предоставлять драйвера к устройствам и т.д. А тот кто этим занимается и называется ОС. Даже если на экране одна голая консоль без утилит, не говоря уже про целый браузер с GUI.

Астрономы, в частности Кеплер. Астрологи это любители гороскопов и гадания.

Особенно забавляет формулировка про "стороннего разработчика". Т.е. якобы человек не из M$ найти не может, а человек из M$ может? Не удивлюсь, если проговаривая это они про себя думали: "мы специально этот бекдор очень сложным сделали, когда его писали, не мог его никто сам найти".

1
23 ...

Информация

В рейтинге
3 058-й
Откуда
Украина
Дата рождения
Зарегистрирован
Активность