Maksud saya seperti ini:
<?php
$number1 = 5; // (Type 'Int')
$operator1 = +; // (Type non-existent 'Operator')
$number2 = 5; // (Type 'Int')
$operator2 = *; // (Type non-existent 'Operator')
$number3 = 8; // (Type 'Int')
$test = $number1 $operator1 $number2 $operator2 $number3; //5 + 5 * 8.
var_dump($test);
?>
Tetapi juga dengan cara ini:
<?php
$number1 = 5;
$number3 = 9;
$operator1 = <;
if ($number1 $operator1 $number3) { //5 < 9 (true)
echo 'true';
}
?>
Sepertinya tidak ada bahasa yang memiliki ini - apakah ada alasan bagus mengapa mereka tidak memilikinya?
programming-languages
variables
operators
kgongonowdoe
sumber
sumber
(+)
adalahNum a => a -> a -> a
IIRC. Anda juga dapat mendefinisikan fungsi agar dapat ditulis infixed (a + b
bukan(+) a b
)Jawaban:
Operator hanyalah fungsi dengan nama lucu, dengan beberapa sintaks khusus.
Dalam banyak bahasa, beragam seperti C ++ dan Python, Anda dapat mendefinisikan ulang operator dengan mengganti metode khusus kelas Anda. Kemudian operator standar (mis.
+
) Bekerja sesuai dengan logika yang Anda berikan (mis. String gabungan atau menambahkan matriks atau apa pun).Karena fungsi-fungsi yang mendefinisikan operator seperti itu hanyalah metode, Anda dapat meneruskannya seperti fungsi:
Bahasa lain memungkinkan Anda untuk secara langsung mendefinisikan operator baru sebagai fungsi, dan menggunakannya dalam bentuk infix.
Sayangnya, saya tidak yakin apakah PHP mendukung hal seperti itu, dan jika mendukungnya akan menjadi hal yang baik. Gunakan fungsi sederhana, lebih mudah dibaca daripada
$foo $operator $bar
.sumber
$
operator yang meniadakan tanda kurung (terutama beberapa bersarang) - tetapi ini hanya dapat bekerja dengan non Fungsi -variadic, sehingga tidak termasuk misalnya Python dan Java. Komposisi fungsi OTOH unary dapat dilakukan dengan baik .operator
modul standar yang memungkinkan Anda menulisaction = operator.add
, dan membuatnya bekerja untuk semua jenis yang mendefinisikan+
(bukan hanyaint
).+
bekerja pada Num typeclass sehingga Anda dapat menerapkan+
untuk semua tipe data baru yang Anda buat, tetapi dengan cara yang sama seperti Anda melakukan hal lain misalnya fmap untuk functor. Merupakan hal yang wajar bagi Haskell untuk memungkinkan operator kelebihan beban sehingga mereka harus bekerja keras untuk tidak membiarkannya!$operator1 = +
dan menggunakannya sebagai ekspresi, Anda tidak perlu menggunakan operator yang berlebihan sama sekali !Ada banyak bahasa yang memungkinkan semacam pemrograman . Secara khusus, saya terkejut melihat tidak ada jawaban yang berbicara tentang keluarga bahasa Lisp .
Dari wikipedia:
Kemudian dalam teks:
Bahasa yang gampang
Intro cepat dibuat untuk Lisp berikut.
Salah satu cara untuk melihat kode adalah sebagai rangkaian instruksi: lakukan ini, lalu lakukan itu, lalu lakukan hal lain ini ... Ini adalah daftar! Daftar hal-hal yang harus dilakukan program. Dan tentu saja Anda dapat memiliki daftar di dalam daftar untuk mewakili loop dan seterusnya ..
Jika kita mewakili daftar yang berisi unsur-unsur a, b, c, d seperti ini: (abcd) kita mendapatkan sesuatu yang tampak seperti Lisp fungsi panggilan, di mana
a
adalah fungsi, danb
,c
,d
adalah argumen. Jika fakta khas "Hello World!" Program dapat ditulis seperti ini:(println "Hello World!")
Tentu saja
b
,c
ataud
dapat berupa daftar yang mengevaluasi sesuatu juga. Berikut ini:(println "I can add :" (+ 1 3) )
kemudian akan mencetak "" Saya dapat menambahkan: 4 ".Jadi, sebuah program adalah serangkaian daftar bersarang, dan elemen pertama adalah fungsi. Berita baiknya adalah kita dapat memanipulasi daftar! Jadi kita bisa memanipulasi bahasa pemrograman.
Keuntungan Lisp
Ini tidak hanya jauh lebih mudah di Lisps untuk membuat operator baru, juga hampir mustahil untuk menulis beberapa operator dalam bahasa lain karena argumen dievaluasi ketika diteruskan ke fungsi.
Misalnya dalam bahasa mirip C, misalkan Anda ingin menulis
if
operator sendiri, seperti:my-if(condition, if-true, if-false)
my-if(false, print("I should not be printed"), print("I should be printed"))
Dalam hal ini kedua argumen akan dievaluasi dan dicetak, dalam urutan yang tergantung pada urutan evaluasi argumen.
Di Lisps, menulis operator (kami menyebutnya makro) dan menulis fungsi adalah tentang hal yang sama dan digunakan dengan cara yang sama. Perbedaan utama adalah bahwa parameter untuk makro tidak dievaluasi sebelum diteruskan sebagai argumen ke makro. Ini penting untuk dapat menulis beberapa operator, seperti di
if
atas.Bahasa dunia nyata
Menunjukkan betapa tepatnya sedikit di luar ruang lingkup di sini, tetapi saya mendorong Anda untuk mencoba pemrograman dalam satu Lisp untuk mempelajari lebih lanjut. Misalnya, Anda dapat melihat:
Oh, ngomong-ngomong, Lisp berarti LISt Processing.
Mengenai contoh Anda
Saya akan memberikan contoh menggunakan Clojure di bawah ini:
Jika Anda dapat menulis suatu
add
fungsi di Clojure(defn add [a b] ...your-implementation-here... )
, Anda dapat menamainya+
seperti itu(defn + [a b] ...your-implementation-here... )
. Ini sebenarnya apa yang dilakukan dalam implementasi nyata (tubuh fungsi sedikit lebih terlibat tetapi definisi dasarnya sama dengan yang saya tulis di atas).Bagaimana dengan notasi infiks? Nah Clojure menggunakan
prefix
notasi (atau Polandia), jadi kita bisa membuatinfix-to-prefix
makro yang akan mengubah kode awalan menjadi kode Clojure. Yang sebenarnya sangat mudah (sebenarnya ini adalah salah satu latihan makro di koalisi clojure)! Itu juga bisa dilihat di alam liar, misalnya lihat Incanter$=
macro .Ini adalah versi paling sederhana dari koans yang dijelaskan:
Untuk mengarahkan poin lebih jauh, beberapa Lisp mengutip :
sumber
if
, tetapi Anda harus membungkusthen
danelse
argumen dengan lambdas. PHP dan JavaScript milikifunction()
, C ++ memiliki lambdas, dan ada ekstensi Apple ke C dengan lambdas.Sebagian besar implementasi bahasa memiliki langkah di mana pengurai menganalisis kode Anda dan membangun pohon darinya. Jadi misalnya ekspresi
5 + 5 * 8
akan diuraikan sebagaiterima kasih kepada pengetahuan kompiler tentang prioritas. Jika Anda memberinya variabel sebagai pengganti operator, ia tidak akan mengetahui urutan operasi yang tepat sebelum menjalankan kode. Untuk sebagian besar implementasi yang akan menjadi masalah serius, jadi sebagian besar bahasa tidak mengizinkannya.
Anda tentu saja bisa memahami bahasa di mana parser hanya mem-parsing di atas sebagai urutan ekspresi dan operator, untuk diurutkan dan dievaluasi saat runtime. Mungkin tidak ada banyak aplikasi untuk ini.
Banyak bahasa scripting memungkinkan evaluasi ekspresi sewenang-wenang (atau setidaknya ekspresi aritmatika sewenang-wenang seperti dalam kasus
expr
) pada saat runtime. Di sana Anda hanya bisa menggabungkan angka dan operator Anda menjadi satu ekspresi dan biarkan bahasa mengevaluasi itu. Dalam PHP (dan banyak lainnya) fungsi itu disebuteval
.Ada juga bahasa yang memungkinkan pembuatan kode pada waktu kompilasi. The ekspresi mixin di D datang ke pikiran saya, di mana saya percaya Anda bisa menulis sesuatu seperti
Di sini
operator1
danoperator2
harus berupa konstanta string yang diketahui pada waktu kompilasi, misalnya parameter templat.number1
,number2
dannumber3
dibiarkan sebagai variabel runtime normal.Jawaban lain sudah membahas berbagai cara bagaimana operator dan suatu fungsi kurang lebih sama, tergantung pada bahasanya. Tetapi biasanya ada perbedaan sintaksis antara simbol operator infix bawaan
+
dan nama yang bisa dipanggiloperator1
. Saya akan menyerahkan detailnya ke jawaban-jawaban lainnya.sumber
eval()
konstruksi bahasa " ... Secara teknis ini memberikan hasil yang diinginkan yang ditanyakan dalam pertanyaan.eval
tidak menjawab aspek itu, karena untukeval
operator hanya string. Oleh karena itu saya mulai dengan penjelasan mengapa variabel yang diketik operator akan menyebabkan masalah, sebelum saya mulai membahas alternatif.Algol 68 memiliki fitur itu. Contoh Anda dalam Algol 68 akan terlihat seperti ini:
Contoh kedua Anda akan terlihat seperti ini:
Anda akan mencatat bahwa simbol-simbol operator didefinisikan dan ditetapkan metode tubuh yang berisi operasi yang diinginkan. Operator dan operan mereka semua diketik, dan operator dapat diberi prioritas sehingga evaluasi akan terjadi dalam urutan yang benar. Anda mungkin juga memperhatikan bahwa ada sedikit perbedaan dalam pengelompokan antara simbol operator dan simbol variabel.
Sebenarnya, meskipun bahasa tersebut ditulis menggunakan font, mesin-mesin saat itu tidak dapat menangani font (pita kertas dan kartu berlubang), dan stropping digunakan. Program mungkin akan dimasukkan sebagai:
Anda juga dapat memainkan game menarik dengan bahasa tersebut ketika Anda dapat menentukan simbol Anda sendiri untuk operator, yang pernah saya eksploitasi beberapa tahun yang lalu ... [2].
Referensi:
[1] Pengantar Informal ke Algol 68 oleh CHLindsey dan SG van der Meulen, Belanda Utara, 1971 .
[2] Algol 68 Frasa, Alat bantu penulisan kompiler di Algol 68 , BC Tompsett, Konferensi Internasional tentang Aplikasi Algol 68, Di Universitas East Anglia, Norwich, Inggris, 1976 ..
sumber