Як програмування в JavaScript, я помітив, що все, що можна зробити з операторами та блоками, можна зробити лише з виразами. Чи може мова програмування добре працювати лише з виразами? І якщо так, то чому взагалі використовуються твердження?
Як програмування в JavaScript, я помітив, що все, що можна зробити з операторами та блоками, можна зробити лише з виразами. Чи може мова програмування добре працювати лише з виразами? І якщо так, то чому взагалі використовуються твердження?
Відповіді:
Звичайно. Найпростіший спосіб - присвоїти значення результату кожній конструкції, яка наразі є оператором, і тим самим перетворити її у вираз. Це не обов'язково корисно чи змістовно. Єдиний потенційний приріст - це трохи концептуальної простоти. Однак якщо потім перейти до видалення речей, таких як крапки з комою та циклів (для цього потрібні ланцюжки через інші оператори та функції), програми, які активно використовують оператори, стають некрасивими.
Більш радикальний, але значущий спосіб зробити це - створити мову такою, що майже все має змістовне значення, і використовувати її таким чином, щоб ви майже завжди використовували вираз для цього змістовного значення, а не для інших ефектів. Мови функціонального програмування роблять це (певною мірою; наприклад, Haskell має декларації, які не є виразами).
Висловлювання використовуються тому, що в парадигмі імперативів є багато загальних операцій, які не мають корисного значення результату, і тому, що поняття послідовних інструкцій (а не обчислень) досить добре відповідає цій парадигмі. Якщо великий відсоток вашої програми мутує стан, а не обчислює нові значення, не має сенсу вимагати створення значення (що це за цикл?). На відміну від цього, коли вся ваша парадигма (FP) побудована навколо обчислення значень, люди, які не мають значення результату, не гарантують винятку: натомість ви даєте їм дозорний результат, який нічого не означає.
void
та null
/ unit
полягає в тому, що останні є значеннями і можуть передаватися навколо, тоді як void
є особливим тим, що немає значення цього типу.
Залежить від того, як ви визначаєте "твердження" та "вираз".
Дуже суворе визначення розрізняло б твердження як "речі, які мають побічні ефекти, а може бути і повернене значення", та вирази як "речі, які мають зворотні значення, але не можуть мати побічні ефекти". При такому визначенні жодна змістовна програма не може бути написана без принаймні одного твердження (яке повинно було б оцінити вираз і вивести його повернене значення) - лише чисті вирази не можуть взаємодіяти зі світом поза програмою. Мова сама по собі все ще може бути абсолютно чистою (тобто не мати жодних тверджень), якщо нечиста частина перенесена з мови та в підтримуючу екосистему (саме це робить Haskell, хоча мова має визначення, а також вирази) .
Якщо ж ви допускаєте побічні ефекти в виразах, то відмінність між висловлюваннями і виразами стає довільною і набагато менш цікавою - звичайно, ви можете придумати мову програмування, яка складається тільки з виразів; Більшість діалектів Ліспа так само працюють. У такій ситуації оцінювати вираз за його побічними ефектами майже точно так само, як виконувати вислів, і можна стверджувати, що в такій мові вирази та висловлювання - це одне і те ж. Тоді різниця між твердженням і виразом є лише синтаксичною.
Багато мов все ще роблять це синтаксичне розрізнення, оскільки воно корисне не з технічних причин, а для читабельності. Зробити щось вираженням сигналізує про те, що ви зацікавлені у його поверненому значенні, меншій мірі його побічні ефекти; зробивши це твердження, повідомляє читачеві, що ви маєте намір викликати побічні ефекти, і повернене значення може бути, а може і не бути цікавим.
ATL і Xtend - це непрацездатні мови програмування. Багато функціональних мов також є менш твердими. Так, так, мова програмування може відмінно працювати без заяв. Я думаю, що висловлювання багатьма мовами є реліктом імперативного програмування. Вони все ще використовуються, оскільки широко відомі, а в деяких випадках роблять код більш читабельним.
Так.
Функціональні мови (і мови єдиного призначення) - це все вираження. Прикладами є Haskal (і SISAL). Де і якщо оператори, і для циклів повертають значення.
Існують і інші класи мов: найлегший, який спадає на думку, - це декларативні мови (я впевнений, що існує багато інших, які не залежать від тверджень). Ці мови навіть не потребують виразів (у тому ж сенсі, як ви зазвичай вважаєте). Ви заявляєте, що відповідає дійсності, і ви можете отримати кілька результатів. Простий тут prolog
.