dalam JavaScript:
function getTopCustomersOfTheYear(howManyCustomers, whichYear) {
// Some code here.
}
getTopCustomersOfTheYear(50, 2010);
dalam C #:
public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers,
int whichYear)
{
// Some code here
}
List<Customer> customers = GetTopCustomersOfTheYear(50, 2010);
dalam PHP:
public function getTopCustomersOfTheYear($howManyCustomers, $whichYear)
{
// Some code here
}
$customers = getTopCustomersOfTheYear(50, 2010);
Apakah ada bahasa di luar sana yang mendukung sintaks ini:
function GetTop(x)CustomersOfTheYear(y)
{
// Some code here
}
returnValue = GetTop(50)CustomersOfTheYear(2010);
Bukankah ini lebih merupakan bentuk penulisan fungsi semantik, lebih mudah dibaca?
Pembaruan: Alasan saya mengajukan pertanyaan ini adalah, saya menulis artikel tentang sintaks baru untuk bahasa baru. Namun, saya berpikir bahwa memiliki sintaksis seperti itu untuk mendeklarasikan metode bisa lebih baik dan lebih ramah kepada pengembang dan akan mengurangi kurva belajar bahasa, karena lebih dekat ke bahasa alami. Saya hanya ingin tahu apakah fitur ini sudah dipertimbangkan atau belum.
programming-languages
language-design
syntax
Saeed Neamati
sumber
sumber
'hello world' indexOf: $o startingAt: 6
atauRectangle width: 100 height: 200
. Btw., Ada apa dengan pertanyaan ini?returnValue = GetTop(50, CustomersOfTheYear(2010))
yang bagi saya terlihat sama-sama mudah dibaca, dan sebenarnya lebih fleksibel / ortogonal. ... dan yeah, itu sintaks normal.Jawaban:
Ya, dan ya. Ya ada bahasa seperti itu, dan ya, banyak orang merasa itu lebih mudah dibaca begitu mereka terbiasa.
Dalam Objective-C, metodenya adalah:
Itu sebenarnya contoh yang cukup dibuat yang tidak membaca dengan baik, jadi inilah yang lebih baik dari kode aktual:
Itu prototipe untuk metode yang mengembalikan contoh UIColor baru menggunakan nilai-nilai merah, hijau, biru, dan alfa. Anda akan menyebutnya seperti ini:
Baca lebih lanjut tentang nama pesan dengan parameter diselingi dalam Bahasa Pemrograman Objective-C .
sumber
+colorWithRed:blue:green:alpha:
. Saya kebetulan menggunakan nama untuk parameter yang sesuai metode, tapi aku bisa dengan mudah menggunakanr
,b
,g
, dana
. Dengan parameter bernama seperti penawaran JavaScript, Anda akan menggunakan nama sebenarnya yang diberikan untuk mengakses nilai. Parameter true names juga biasanya dapat diberikan dalam urutan apa pun, dan parameter mungkin opsional. Begitu mirip, ya, tetapi secara fundamental berbeda.color(r=0xFF,g=0xFF,b=0x55)
ataucolor(b=0x32,r=0x7F,a=.5,g=0xFF)
dan sebagainya. Mari kita panggil parameter yang sangat bernama itu. :)Jawab: smalltalk
http://en.wikipedia.org/wiki/Smalltalk
'hello world' indexOf: $o startingAt: 6
seperti Java"hello world".indexOfStartingAt(o, 6)
Rectangle width: 100 height: 200
seperti Javanew Rectangle(100, 200)
Sintaksnya adalah ...
expression word1: parm1 word2: parm2 word3: parm3 ...
Nama metode yang dipanggil adalah gabungan dari semua kata.sumber
Saya yakin Anda mencari abstraksi yang disebut " antarmuka yang lancar (saya dengan ini memberikan komentar, awalnya dibuat oleh @Jesper, ke" jawaban ")." Pola umum sekarang ini telah berhasil diimplementasikan dalam banyak bahasa, di mana Objective-C hanya satu.
Ini adalah contoh yang cukup bersih:
Anda dapat melihat bagaimana sesuatu seperti ini dapat diimplementasikan di Randy Patterson 's bagaimana merancang antarmuka yang lancar .
Andre Vianna memberikan sejarah singkat dan kemudian membahas kemungkinan implementasi dalam dua bagian artikel lagi, termasuk banyak informasi berguna. Vianna menunjuk kembali ke ide lama yang pertama kali saya temui di Smalltalk 80 yang disebut " cascading ," yang memungkinkan pengiriman beberapa pesan ke objek yang sama. Itu terlihat seperti ini:
Cascading kemudian berkembang menjadi " metode chaining ," di mana kita " Membuat metode pengubah mengembalikan objek host, sehingga beberapa pengubah dapat dipanggil dalam satu ekspresi. " Metode rantai kemudian tumbuh menjadi konsep antarmuka yang lancar yang kita kenal dan gunakan sering hari ini . Apa yang Anda rencanakan untuk dilakukan terlihat sangat mirip.
Ayende Rahien membahas bagaimana "antarmuka lancar" mungkin cukup berbeda secara signifikan dari "metode rantai" hingga pantas namanya sendiri .
Antarmuka yang lancar umumnya terlihat di beberapa alat baru yang digunakan dalam pengembangan yang didorong perilaku (BDD) dan bahkan telah menemukan jalan mereka ke NUnit , alat pengujian unit .NET utama, dalam Model Assert Constraint-Based Assert Model yang baru .
Pendekatan dasar ini selanjutnya telah diimplementasikan dalam bahasa lain, termasuk Ruby, Python, C #, Objective-C dan Java . Untuk menerapkan sesuatu yang serupa, Anda perlu mempelajari ide " penutupan ," yang cukup mendasar untuk rantai dan kelancaran.
Mungkin Anda dapat memperbaiki model ini; itulah cara kami mendapatkan bahasa baru yang hebat. Namun, saya percaya bahwa metode chaining yang sepenuhnya memahami dan antarmuka yang lancar akan memberi Anda titik awal yang bagus untuk mengembangkan ide-ide Anda!
sumber
function GetTop(x)CustomersOfTheYear(y)
. Ini adalah fungsi tunggal, bukan panggilan berantai ke dua fungsi yang berbeda.Objective-C melakukan itu. Berikut ini adalah prototipe yang khas:
Inilah cara Anda memanggil metode seperti itu:
Objective-C terutama digunakan dengan Cocoa untuk Mac OS X dan Cocoa Touch untuk iOS, tetapi gcc akan membangun kode Objective-C di hampir semua platform tempat gcc bekerja.
sumber
Di Common lisp, Anda dapat menentukan argumen kata kunci untuk fungsi seperti ini:
Fungsi ini dinamakan seperti ini:
Di Ada Anda tidak memerlukan deklarasi khusus - Anda dapat memanggil prosedur atau fungsi apa pun sebagai alternatif dengan mendaftar argumen secara berurutan, atau dengan menyebutkan argumen seperti ini:
Terakhir, pustaka boost mencakup lapisan peretasan untuk menambahkan fitur ke C ++: http://www.boost.org/doc/libs/release/libs/parameter/doc/html/index.html
sumber
Saya tidak dapat menemukan namanya, tetapi ada pola desain untuk mencapai sesuatu yang serupa, di mana panggilan fungsi mengembalikan objek baru yang dimodifikasi seperti yang dijelaskan. Sebagai contoh:
Ini tidak sering digunakan karena data Anda harus sangat ortogonal untuk menghindari kompleksitas yang tidak dapat dikelola di bawah tenda, tetapi dapat berguna dalam situasi yang tepat.
sumber
Python memiliki parameter kata kunci. Contoh definisi fungsi
Contoh panggilan fungsi
(Saya mengerti ini tidak sepenuhnya sesuai dengan pertanyaan awal, tetapi jika parameter kata kunci di lisp memenuhi syarat, maka lakukan ini. Di Smalltalk dan Objective-C, bagaimanapun, kata kunci di antara argumen benar-benar merupakan bagian dari fungsi nama / pencarian. .)
sumber
Agda memiliki notasi mixfix
Setiap kali fungsi diberi nama dengan garis bawah, itu dapat dibagi menjadi dua bagian dengan argumen di antaranya
sumber
Meskipun bukan bahasa pemrograman per se , Mentimun mengambil parameter di tengah nama fungsi, yang dapat mencakup spasi dan dimaksudkan untuk terlihat seperti bahasa Inggris.
Namun 'fungsi' didefinisikan dalam Ruby
sumber
Di TeX Anda dapat mendefinisikan makro yang memiliki "pola argumen" yang pada dasarnya berarti bahwa protokol panggilan Anda gratis. Untuk contoh spesifik Anda, Anda dapat menggunakan
Perhatikan bahwa Anda juga dapat menyingkirkan
;
jika Anda setuju untuk bermain dengan register:TeX memungkinkan Anda mengkonfigurasi ulang lexer-nya, dan berkat
\afterassignment
makro yang saya gunakan di atas, Anda dapat menggunakan prosedur bawaan untuk nomor lex. Sangat berguna untuk mendefinisikan protokol panggilan yang sangat singkat . Sebagai contoh, sangat masuk akal untuk menulis makro TeX memahami notasi Markdown untuk tabel.Sekarang Anda bertanya "bagaimana cara mengakses database saya di mana pelanggan disimpan dari TeX?" Tetapi ini adalah pertanyaan lain. :)
Dalam Common lisp, ini sangat mungkin untuk mendefinisikan
query
makro yang memungkinkan Anda untuk menulisdi mana getCustomers dan OfTheYear diartikan sebagai simbol. Maka tugas makro untuk memahaminya. Cisp umum sangat baik dalam domain keterbacaan kode (ya, saya sungguh-sungguh!) Karena sistem makro memungkinkan untuk dengan mudah membuat pseudo-bahasa yang disetel untuk aplikasi Anda. (Saya pikir mereka disebut bahasa aplikasi.)
PS: Sepertinya tidak ada yang mengutip C ++. Yang paling dekat yang bisa Anda dapatkan (tanpa preprosesor) adalah
Kuncinya adalah membiarkan
getTopCustomers
mengembalikan referensi padaquery
(atau apa pun) yang juga mengimplementasikanOfTheYear
. Anda bisa membuat contoh ini hingga bahasa permintaan yang kecil tetapi kemudian Anda harus mengidentifikasi properti akhir (mengembalikan nilai) atau menambahkanfinalise
metode (melakukan pencarian dan mengembalikan nilai). Jika Anda menyukainya, Anda juga dapat meniru pengontrol aliran STL dan dapat menulis hal-hal sepertitapi ini sekali lagi mengarah ke bahasa aplikasi.
Sunting: Saya mengabaikan jawaban @han, yang juga mengutip Common Lisp dan C ++ (tetapi tidak TeX!).
sumber
Dalam JavaScript atau bahasa lain apa pun yang mendukung penutupan, Anda dapat menjelajah fungsi seperti ini:
sumber
var top5Func = getTopCustomersFunc(37);
. Angka '5' menyesatkan di sini, tetapi kodenya bekerja persis sama seperti jika variabel telah dinamaitop37Func
.Ini tergantung pada definisi Anda tentang "bahasa", tetapi kerangka pengujian kerangka robot memungkinkan Anda menentukan kata kunci dengan cara ini. Dari dokumentasi mereka tentang argumen tertanam :
Di atas menyatakan kata kunci baru (pada dasarnya fungsi) bernama "pilih $ {animal} dari daftar" di mana '$ {animal}' adalah parameter. Anda menyebutnya seperti "pilih kucing dari daftar"
sumber
Informasikan 7.
Dan seterusnya.
sumber
Kata kunci Common Lisp telah disebutkan, tetapi macro Common Lisp juga memungkinkan ini dengan cukup mudah:
Ini kemudian dapat disebut seperti ini:
Satu hal yang perlu diperhatikan adalah syarat
from
dan ketentuannyaat
tidak ditegakkan. Pasti ada sesuatu di sana, melompati mereka sepenuhnya adalah kesalahan, tetapi karena makro akhirnya membuangnya, tidak masalah apa pun yang melampaui keterbacaan (yang penting):sumber
Di Clojure, biasanya digunakan argumen kata kunci untuk situasi seperti ini, misalnya:
(get-customers :top 50 :year 2010)
Argumen kata kunci cukup fleksibel, bisa opsional dan standarnya ditentukan dll.
sumber
Anda dapat meniru ini dengan python. Sebagai contoh,
atau bahkan
sumber