Чи може мова програмування працювати так само без заяв?


9

Як програмування в JavaScript, я помітив, що все, що можна зробити з операторами та блоками, можна зробити лише з виразами. Чи може мова програмування добре працювати лише з виразами? І якщо так, то чому взагалі використовуються твердження?


2
Так, існує багато мов, що є все-таки-вираз, такі як Ruby та всі діалекти Lisp.
amara

@sparkleshy Я бачу, лише здогадка: всі вони мають аналог оператора кома JavaScript (він виконує два оператори та повертає значення останнього)? Це взагалі рішення для виконання двох операцій послідовно? Я вважаю, що прогрес CL є аналогом, я думаю, навіть якщо він працює для> 2 виразів.
MaiaVictor

1
Все-що-є-вираз не повинно виглядати інакше, ніж звичайна мова висловлювань, заяви просто ... мають значення. Якщо ви зробили вирази javascript, весь існуючий код був би абсолютно дійсним.
amara

1
CoffeeScript - це все, що є виразом, мова, яка компілюється в JavaScript.
Спіке

1
пов'язаний (можливо, дублікат): яка корисна виразність буде неможливою у мові, де вираз не є висловом? "Чому стільки граматик розрізняє expr і stmt, коли зазначено у відповідях, це не має сенсу".
гнат

Відповіді:


14

Звичайно. Найпростіший спосіб - присвоїти значення результату кожній конструкції, яка наразі є оператором, і тим самим перетворити її у вираз. Це не обов'язково корисно чи змістовно. Єдиний потенційний приріст - це трохи концептуальної простоти. Однак якщо потім перейти до видалення речей, таких як крапки з комою та циклів (для цього потрібні ланцюжки через інші оператори та функції), програми, які активно використовують оператори, стають некрасивими.

Більш радикальний, але значущий спосіб зробити це - створити мову такою, що майже все має змістовне значення, і використовувати її таким чином, щоб ви майже завжди використовували вираз для цього змістовного значення, а не для інших ефектів. Мови функціонального програмування роблять це (певною мірою; наприклад, Haskell має декларації, які не є виразами).

Висловлювання використовуються тому, що в парадигмі імперативів є багато загальних операцій, які не мають корисного значення результату, і тому, що поняття послідовних інструкцій (а не обчислень) досить добре відповідає цій парадигмі. Якщо великий відсоток вашої програми мутує стан, а не обчислює нові значення, не має сенсу вимагати створення значення (що це за цикл?). На відміну від цього, коли вся ваша парадигма (FP) побудована навколо обчислення значень, люди, які не мають значення результату, не гарантують винятку: натомість ви даєте їм дозорний результат, який нічого не означає.


-1 це не зовсім так
амара

3
@sparkleshy Яка частина не відповідає дійсності, і як?

1
перший абзац: ви сумніваєтесь у думці, що у висловлюваннях є корисні значення повернення (але багато хто робить), пропонуйте потворну річ (чому?). другий абзац: заявляє, що всі функціональні мови програмування використовують цю потворну концепцію бахроми, що смішно. третій абзац: false, ми маємо, що в {} блоках вже значення ігнорується і воно не спричиняє проблем, неправильно; Ви вже надаєте їм відсутність значення пустоти, як нульовий не менш значущий за це? загалом: це насправді не так
амара

2
@sparkleshy - Жоден оператор не має корисних повернених значень, тому вони є твердженнями . Вони можуть мати корисні побічні ефекти (наприклад, призначення), але це не те саме. Це насправді не бахрома. Це добре відомо, якщо не зовсім практично, якщо прийняти його до N-го ступеня. І це значення вартового не є нульовим або недійсним, воно є одиницею, яка тонко відрізняється від обох. +1 для delnan, щоб компенсувати це.
Теластин

4
@sparkleshy (1) Ви можете плутати вирази (які можуть бути єдиним компонентом висловлювання) з твердженням (які не є виразом і не мають значення результату). (2) Що? Будь-який захисник ПП підтвердить це (і стверджує, що це добре). Або це лише "все" частина, проти якої ви заперечуєте? (3) {} блоки - це те, про що я говорю ("поняття послідовних інструкцій"). І де я можу сказати, що щось викликає якісь проблеми? Різниця між voidта null/ unitполягає в тому, що останні є значеннями і можуть передаватися навколо, тоді як voidє особливим тим, що немає значення цього типу.

5

Залежить від того, як ви визначаєте "твердження" та "вираз".

Дуже суворе визначення розрізняло б твердження як "речі, які мають побічні ефекти, а може бути і повернене значення", та вирази як "речі, які мають зворотні значення, але не можуть мати побічні ефекти". При такому визначенні жодна змістовна програма не може бути написана без принаймні одного твердження (яке повинно було б оцінити вираз і вивести його повернене значення) - лише чисті вирази не можуть взаємодіяти зі світом поза програмою. Мова сама по собі все ще може бути абсолютно чистою (тобто не мати жодних тверджень), якщо нечиста частина перенесена з мови та в підтримуючу екосистему (саме це робить Haskell, хоча мова має визначення, а також вирази) .

Якщо ж ви допускаєте побічні ефекти в виразах, то відмінність між висловлюваннями і виразами стає довільною і набагато менш цікавою - звичайно, ви можете придумати мову програмування, яка складається тільки з виразів; Більшість діалектів Ліспа так само працюють. У такій ситуації оцінювати вираз за його побічними ефектами майже точно так само, як виконувати вислів, і можна стверджувати, що в такій мові вирази та висловлювання - це одне і те ж. Тоді різниця між твердженням і виразом є лише синтаксичною.

Багато мов все ще роблять це синтаксичне розрізнення, оскільки воно корисне не з технічних причин, а для читабельності. Зробити щось вираженням сигналізує про те, що ви зацікавлені у його поверненому значенні, меншій мірі його побічні ефекти; зробивши це твердження, повідомляє читачеві, що ви маєте намір викликати побічні ефекти, і повернене значення може бути, а може і не бути цікавим.


+1 за коментарі щодо читабельності ... Зрештою, люди повинні це зрозуміти ...
mattnz

1

ATL і Xtend - це непрацездатні мови програмування. Багато функціональних мов також є менш твердими. Так, так, мова програмування може відмінно працювати без заяв. Я думаю, що висловлювання багатьма мовами є реліктом імперативного програмування. Вони все ще використовуються, оскільки широко відомі, а в деяких випадках роблять код більш читабельним.


1

Так.

Функціональні мови (і мови єдиного призначення) - це все вираження. Прикладами є Haskal (і SISAL). Де і якщо оператори, і для циклів повертають значення.

Існують і інші класи мов: найлегший, який спадає на думку, - це декларативні мови (я впевнений, що існує багато інших, які не залежать від тверджень). Ці мови навіть не потребують виразів (у тому ж сенсі, як ви зазвичай вважаєте). Ви заявляєте, що відповідає дійсності, і ви можете отримати кілька результатів. Простий тут prolog.


У Haskell є декларації, вони не є виразами.
Janus Troelsen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.