Saya memodelkan bahasa pemrograman untuk bersenang-senang, dan sintaksisnya sangat dipengaruhi oleh Scala - khususnya definisi fungsi.
Saya telah mengalami masalah desain karena bahasa saya tidak membedakan antara fungsi yang didefinisikan melalui def
sintaks (metode kelas) dan fungsi anonim yang ditugaskan ke nilai (dibuat menggunakan =>
) - ini menghilangkan perbedaan dalam implementasi dan perilaku .
Hasilnya adalah bahwa dua definisi berikut memiliki arti yang sama:
def square(x: Int) = x*x
val square = (x: Int) => x*x
Tidak ada alasan untuk bentuk yang terakhir (penugasan fungsi anonim langsung) untuk digunakan dalam situasi normal - sangat mungkin untuk menggunakannya daripada def
formulir.
Apakah memiliki sintaks duplikat untuk mendefinisikan fungsi-fungsi yang disebutkan akan merusak ortogonalitas bahasa atau aspek desain lainnya?
Saya lebih suka solusi ini karena memungkinkan untuk definisi pendek dan intuitif dari metode dan fungsi bernama (via def
), dan definisi pendek dari fungsi anonim (menggunakan =>
).
Sunting: Scala memang membedakan antara dua - fungsi anonim tidak sama dengan metode yang didefinisikan def
dalam Scala. Perbedaannya relatif halus - lihat posting yang saya tautkan sebelumnya.
val
notasi Anda ?
fun
untuk mendefinisikan fungsi rekursif.
def
. Ini hanya efek samping dari fakta bahwa fungsi anonim, katakanlah (x : Int) => x + 1
adalah objek, dan objek dapat ditugaskan ke nilai val f = ...
. Desainer bahasa harus keluar dari jalan mereka untuk melarang sintaksis. Ini tidak persis sama dengan secara eksplisit menempatkan upaya untuk mendukung dua sintaks berbeda yang melakukan (kurang-lebih) hal yang sama.
However, assigning existing functions
tampaknya tidak ada akhir kalimat