Saya sangat jarang bertemu programmer lain!
Pikiran saya ketika saya pertama kali melihat token itu "menyiratkan bahwa" karena itulah yang akan membacanya sebagai bukti matematika tetapi itu jelas tidak masuk akal.
Jadi bagaimana saya mengatakan atau membaca "=>" seperti pada: -
IEnumerable<Person> Adults = people.Where(p => p.Age > 16)
Atau bahkan ada cara yang disepakati untuk mengatakannya?
c#
.net
lambda
conventions
Christopher Edwards
sumber
sumber
Jawaban:
Saya biasanya mengatakan 'seperti itu' ketika membaca operator itu.
Dalam contoh Anda, p => p.Age> 16 berbunyi "P, sehingga p.Age lebih besar dari 16."
Bahkan, saya mengajukan pertanyaan ini di forum pra-rilis resmi linq, dan Anders Hejlsberg menjawab dengan mengatakan
Sejauh 'pergi ke' - itu tidak pernah masuk akal bagi saya. 'p' tidak ke mana-mana.
Dalam hal membaca kode kepada seseorang, katakanlah, melalui telepon, lalu selama mereka adalah sesama programmer C #, saya hanya akan menggunakan kata 'lambda' - yaitu, "p lambda p dot usia lebih besar dari enambelas."
Dalam komentar Steve Jessop menyebutkan 'peta untuk' dalam kasus transformasi - jadi ambil contoh Anders:
akan membaca
Tampaknya memang lebih dekat dengan maksud sebenarnya dari kode daripada 'menjadi' untuk kasus ini.
sumber
Dari MSDN :
sumber
Membaca Kode Melalui Telepon
Dari Eric Lippert:
Saya pribadi akan mengatakan c => c +1 sebagai "see goes to see plus one". Beberapa variasi yang pernah saya dengar:
Untuk proyeksi, (Pelanggan c) => c.Name: "lihat pelanggan menjadi melihat nama titik"
Untuk predikat, (Pelanggan c) => c.Age> 21: "pelanggan melihat sedemikian rupa sehingga usia dot lebih dari dua puluh satu"
sumber
Saya selalu menyebutnya "operator wang" :-)
"p wang umur p lebih besar dari 16"
sumber
Saya pernah melihat orang berkata, "Panah."
sumber
Saya menggunakan "pergi ke" karena buku LINQ mengatakan kepada saya untuk :)
sumber
Bagaimana dengan "map to"? Keduanya ringkas dan bisa dibilang lebih akurat secara teknis (yaitu tidak ada saran perubahan negara seperti dengan "pergi ke" atau "menjadi", tidak ada penggabungan satu set dengan fungsi karakteristiknya seperti "seperti itu" atau "yang") daripada alternatif lain. Meskipun jika sudah ada standar seperti yang ditunjukkan oleh halaman MSDN, mungkin Anda harus melakukannya (setidaknya untuk kode C #).
sumber
"Peta ke" adalah pelafalan pilihan saya. Secara matematis, fungsi "memetakan" argumennya ke nilai pengembaliannya (orang mungkin bahkan menyebut fungsi itu "pemetaan"), jadi masuk akal bagi saya untuk menggunakan terminologi ini dalam pemrograman, khususnya sebagai pemrograman fungsional (terutama kalkulus lambda) sangat dekat dengan matematika. Ini juga lebih netral daripada "menjadi", "pergi ke", dll., Karena tidak menyarankan perubahan status, seperti yang disebutkan bebas konteks.
sumber
Saya belum terlalu memikirkannya, tapi saya hanya mengatakan "untuk" dengan mudah. Ini singkat dan ringkas, dan menyiratkan bahwa variabel diteruskan ke ekspresi. Saya kira itu bisa dikacaukan dengan angka 2 ("dua"), tetapi saya cenderung mengucapkan "menjadi" lebih seperti "ta" ketika berbicara. Tak seorang pun (yang tahu lambdas, setidaknya) pernah mengatakan kepada saya bahwa mereka menganggapnya ambigu ...
sumber
Jawaban singkat saya: "c 'lambda-of' e". Meskipun saya berpegang teguh pada "fungsi lambda 'fungsi' e", saya pikir lambda adalah kompromi ekumenis. Analisis berikut.
Ini adalah pertanyaan yang bagus jika hanya untuk jawaban yang aneh. Sebagian besar terjemahan memiliki arti lain selain untuk ekspresi lambda, yang mengarah ke interpretasi eksotis. Sebagai peretas berekspresi lambda lama, saya mengabaikan notasi .NET dan menulis ulang sebagai lambda di kepala saya sambil berharap mereka telah melakukan hampir hal lain untuk ini.
Untuk menceritakan kode melalui telepon, Anda ingin seseorang dapat menuliskan kode secara berurutan. Itu masalah, tentu saja, tetapi lambda-panah atau sesuatu mungkin adalah yang terbaik yang bisa Anda dapatkan, atau mungkin lambda-in, tetapi lambda-of adalah yang paling akurat.
Masalahnya adalah penggunaan infiks dan bagaimana menamai semuanya dan peran bagian kiri dan kanan dengan sesuatu yang berfungsi ketika diucapkan di tempat infiks.
Ini mungkin masalah yang terlalu terbatas!
Saya tidak akan menggunakan "seperti itu" karena itu menyiratkan bahwa sisi kanan adalah predikat yang harus dipenuhi oleh sisi kiri. Itu sangat berbeda dari berbicara tentang sisi kanan dari mana sisi kiri telah diabstraksikan sebagai parameter fungsional. (Pernyataan MSDN tentang "Semua ekspresi lambda" hanya ofensif dan juga tidak akurat.)
Sesuatu yang menggelitik tentang "pergi ke" meskipun mungkin sedekat yang bisa kita dapatkan. "Pergi ke" menyiratkan transformasi, tetapi tidak ada persis beberapa variabel c yang pergi ke ekspresi dalam c. Abstraksi ke suatu fungsi agak sulit dipahami. Saya bisa terbiasa dengan hal ini, tetapi saya masih merindukan sesuatu yang menekankan abstraksi variabel.
Karena sisi kiri selalu merupakan pengidentifikasi sederhana dalam kasus-kasus yang digunakan sejauh ini [tetapi tunggu ekstensi yang dapat membingungkan ini nanti], saya pikir untuk "c => ekspresi" Saya akan membaca ekspresi "c 'lambda-function' "'atau bahkan" c' arg '' berfungsi 'ekspresi ". Dalam kasus terakhir, saya kemudian bisa mengatakan hal-hal seperti "b 'arg' c 'arg' 'function' expression".
Mungkin lebih baik untuk membuatnya lebih jelas bahwa ekspresi lambda sedang diperkenalkan dan mengatakan sesuatu seperti "'arg' b 'arg' c 'function' ekspresi".
Mencari tahu bagaimana menerjemahkan semua ini ke bahasa lain adalah latihan untuk siswa [; <).
Saya masih khawatir tentang "(b, c) => ekspresi" dan varian lain yang mungkin muncul jika belum. Mungkin ungkapan "'args' b, c 'function'".
Setelah semua renungan ini, saya perhatikan bahwa saya datang untuk menerjemahkan "c => e" sebagai "'lambda' c 'fungsi' e" dan memperhatikan bahwa pemetaan ke bentuk yang tepat harus dipahami oleh konteks: λc (e ), c => e, f di mana f (c) = e, dll.
Saya berharap bahwa penjelasan "masuk" akan berlaku hanya karena ini adalah di mana mayoritas dominan akan melihat ekspresi lambda untuk pertama kalinya. Sangat disayangkan. Kompromi yang baik mungkin "c ' lambda-of ' e"
sumber
Jika Anda membayangkan ekspresi lambda sebagai metode anonim, "lanjutkan ke" cukup masuk akal.
n "pergi ke" ekspresi n == String.Empty.
Itu pergi ke metode anonim, jadi Anda tidak harus pergi ke metode dalam kode!
Maaf untuk itu.
Jujur, saya tidak suka menggunakan "pergi ke" di kepala saya, tetapi saya melihat orang lain mengatakan itu tampak aneh, dan saya pikir saya akan menjernihkannya.
sumber
Selain memperoleh ruang lingkup sebelumnya (semua variabel dan konstanta yang berada dalam ruang lingkup untuk baris kode normal pada titik di mana ekspresi lambda tersedia untuk kode ekspresi) ekspresi Lambda pada dasarnya adalah gula sintaksis untuk fungsi inline.
Daftar nilai di sebelah kiri operator produksi ("=>") memberikan kontribusi struktur dan konten dari bingkai tumpukan yang digunakan untuk melakukan panggilan ke fungsi ini. Anda bisa mengatakan bahwa daftar nilai berkontribusi baik deklarasi parameter dan argumen yang dikirimkan; dalam kode yang lebih konvensional, ini menentukan struktur dan konten bingkai tumpukan yang digunakan untuk melakukan panggilan ke suatu fungsi.
Akibatnya, nilai-nilai "pergi ke" kode ekspresi. Apakah Anda lebih suka mengatakan "menentukan bingkai tumpukan untuk" atau "pergi ke"? :)
Dalam penerapan ekspresi boolean yang didefinisikan secara sempit yang digunakan sebagai kondisi filter (penggunaan dominan ekspresi lambda yang dipertimbangkan secara luas oleh jawaban lain untuk pertanyaan ini), sangat masuk akal untuk melewatkan metode yang mendukung maksud kode, dan ini mengarah pada " untuk yang "sama ringkas dan mengatakan lebih banyak tentang arti kode.
Namun, ekspresi lambda bukan satu-satunya provinsi Linq dan di luar konteks ini bentuk yang lebih umum "pergi ke" harus digunakan.
Tapi mengapa "pergi ke"?
Karena "mengisi bingkai tumpukan kode berikut" terlalu lama untuk terus mengatakannya. Saya kira Anda bisa mengatakan "dilewatkan ke".
Perbedaan penting antara parameter yang diteruskan secara eksplisit dan variabel yang ditangkap (jika saya ingat dengan benar - perbaiki saya jika saya salah) adalah bahwa yang pertama dilewatkan dengan referensi dan yang terakhir dengan nilai.
sumber
Sebagian dari masalahnya adalah Anda dapat membacanya dengan keras tergantung pada bagaimana strukturnya. Ini memalukan itu tidak secantik atau seintegrasi ruby |
sumber
Di Ruby, sybmol yang sama ini disebut "hashrocket," dan saya pernah mendengar programmer C # menggunakan istilah itu juga (walaupun itu salah).
sumber
Dua sen saya:
"Ekspresi Lambda dengan parameter s adalah {
return s.Age > 12 && s.Age < 20;
}"Saya suka ini karena mengingatkan saya di mana ekspresi lamdba berasal
=> hanyalah jalan pintas sehingga Anda tidak harus menggunakan kata kunci delegasi dan memasukkan info jenis karena dapat disimpulkan oleh kompiler.
sumber
Istilah saya untuk => sebagaimana diterapkan pada contoh hasil yang ditunjukkan
di mana s.Age lebih besar dari 12 dan s.Age kurang dari 20
x di mana x dikalikan 2
c di mana c.city setara dengan "London"
n di mana n adalah string kosong
sumber