Я моделюю мову програмування для задоволення, і на синтаксис сильно впливає Scala - конкретно визначення функцій.
У мене виникла проблема дизайну, оскільки моя мова не розрізняє функції, визначені за допомогою defсинтаксису (методи класу), і анонімні функції, призначені значенням (створеним за допомогою =>) - це усуває відмінності як в реалізації, так і в поведінці .
Результат полягає в тому, що наступні два визначення означають те саме:
def square(x: Int) = x*x
val square = (x: Int) => x*x
Немає жодної причини використовувати останню форму (негайне призначення анонімних функцій) у будь-якій звичайній ситуації - просто можна використовувати її замість defформи.
Чи може такий дублюючий синтаксис для визначення названих функцій шкодити ортогональності мови чи іншому аспекту дизайну?
Я вважаю за краще це рішення, тому що воно дозволяє робити короткі та інтуїтивні визначення методів та названих функцій (через def), а також короткі визначення анонімних функцій (за допомогою =>).
Edit: Scala робить відмінність між ними - анонімної функцією не є таким же , як методи , визначених з defв Scala. Однак відмінності порівняно тонкі - дивіться пости, які я пов’язував раніше.
valпозначення?
funдля визначення рекурсивної функції.
def. Це лише побічний ефект того факту, що анонімна функція, скажімо, (x : Int) => x + 1є об'єктом, а об'єкти можна присвоювати значенням val f = .... Мовним дизайнерам довелося б піти з шляху, щоб заборонити синтаксис. Це не зовсім те саме, що явно докладати зусиль для підтримки двох різних синтаксисів, які роблять (приблизно) те саме.
However, assigning existing functionsначебто пропущено кінець речення