Я моделюю мову програмування для задоволення, і на синтаксис сильно впливає 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
начебто пропущено кінець речення