Можна розглянути два різні випадки, залежно від вашого синтаксису мови. Якщо ваша мова використовує дужки для позначення програми функції (наприклад f(2+1)
), то пріоритет не має значення. Функцію слід висунути на стек і вискакувати після (наприклад, приклад вище 2 1 + f
). Крім того, ви можете розглядати функцію як значення та негайно виводити її та виводити операцію виклику функції після закриття дужок (яка в іншому випадку повинна трактуватися так само, як і будь-які інші дужки), наприклад f 2 1 + $
, де $
операція виклику функції.
Якщо ваша мова не використовує дужки для позначення виклику функції, а замість цього розміщує аргумент безпосередньо після функції без будь-яких спеціальних пунктуацій (наприклад f 2 + 1
), як це, мабуть, стосується прикладу Вікіпедії, тоді справи дещо складніші. Зауважте, що вираз, який я щойно наводив у прикладі, неоднозначний: f застосовується до 2 і 1 додається до результату, або ми додаємо 2 і 1 разом, а потім називаємо f результатом?
Знову ж таки, є два підходи. Ви можете просто натиснути функцію на стек операторів, коли ви зіткнетесь з нею та призначите їй будь-який пріоритет. Це найпростіший підхід і, мабуть, те, що було зроблено в наведеному прикладі. Однак є практичні питання. По-перше, як визначити функцію? Якщо у вас є обмежений набір, це легко, але якщо у вас визначені користувачем функції, це означає, що ваш парсер повинен занадто швидко повертатися у ваше оточення, яке може швидко заплутатися. І як ви обробляєте функції з кількома аргументами?
Моє відчуття полягає в тому, що для цього стилю синтаксису використання функцій як значень, зручніших оператором додатків функції, має набагато більше сенсу. Тоді ви можете просто ввести оператор програми кожен раз, коли ви читаєте значення, і останнє, що ви прочитали, також було значенням, тому вам не потрібен якийсь спеціальний спосіб вказувати, які ідентифікатори є функціями. Ви також можете працювати з виразами, які повертають функції (що складно або неможливо зі стилем функції як функціонування). А це означає, що ви можете використовувати currying для обробки декількох функцій аргументів, що є масовим спрощенням над спробами керувати ними безпосередньо.
Єдине, що вам потрібно вирішити, - це пріоритет застосування функції. Вибір вирішувати вам, але в кожній мові, яку я використовував, працює так, це був найбільш сильно зобов’язуючий оператор у мові та був правильним асоціативним. (Єдиним цікавим варіантом є Haskell, який, окрім того, що має описану сильно зв'язуючу версію, також має синонім до цього символу, $
який є найбільш слабко зв'язуючим оператором у мові, що дозволяє виразам, як f 2 + 1
застосовувати f до 2, так і f $ 2 + 1
застосовувати це до всього решти виразу)
sin( max( 2 3) / 3 * 3.1415)