Membungkus pikiran saya di sekitar notasi awalan?


10

Saya membaca tentang LISP.

Saya mengerti bagaimana notasi awalan bekerja pada tingkat tertentu, tetapi saya bertanya-tanya apakah ada trik untuk membuatnya intuitif.


6
Terlepas dari latihan, maksud Anda?

Pengguna RPL sejauh ini merupakan rasa favorit saya dari LISP. Bahkan tidak memiliki tanda kurung! en.wikipedia.org/wiki/RPL_(programming_language) Saya rindu menggunakan HP 50g :-(
Robbie

Pada awalnya sepertinya tidak intuitif, tetapi sekarang saya pikir itu luar biasa, dan saya sudah selesai membaca. Sebenarnya cara kita berbicara: "Jumlah ..., produk ..." Namun, itu memang membutuhkan jenis bacaan yang berbeda. Sekarang Anda cukup menerapkan operator untuk semua argumen, alih-alih membacanya dalam satu baris.
Mark C

Apa yang salah dengan notasi awalan? Hampir semua bahasa menggunakannya. Panggilan fungsi hampir selalu awalan.
SK-logic

Tidak juga; "intuitif" intuitif karena Anda telah mempelajarinya dalam bentuk konvensi matematika selama> 20+ tahun. Karena hanya LISP dan mungkin beberapa bahasa lain yang menggunakan konvensi ini, dan Anda masih akan belajar yang lain lebih banyak, itu hampir tidak akan pernah menjadi sama "intuitif". Dan kita hanya berbicara tentang ekspresi sederhana di sini (2 + 3 ... bagaimana Anda ingin mencoba liner "setengah halaman"? :)
Rook

Jawaban:


6

Membacanya secara mental dari kiri ke kanan sebagai bahasa lisan dengan kata kerja yang tepat dapat membantu. Misalnya (+3 2) dapat berupa "tambah tiga dan dua". Dalam kasus yang lebih umum, Anda dapat mengatakan "melakukan $ operasi pada $ operan". Diterapkan pada kasus yang sama: "Lakukan operasi penambahan pada tiga dan dua".


Apa yang akan Anda lakukan dengan ( = 1 2 )dan( > 4 2 )
Kue Tepung Beras

3
Anda akan menggunakan pertanyaan retoris. :) Sama? (Apa?), "1 dan 2! (Erm ... Tidak ...)
Arafangion

@RiceFlour (Hei, saya tumbuh besar memakan makanan yang terbuat dari tepung beras - saya punya masalah gluten.) Saya akan membaca "Apakah satu sama dengan dua?", Atau "Apakah yang berikut ini sama?" Operator yang lebih besar dan lebih kecil dari itu tidak begitu alami dalam bentuk awalan, tapi saya ingin tahu seberapa sering mereka digunakan dalam kode Lisp.
Mark C

7

Trik? Untuk apa?

Ini belum terasa intuitif untuk Anda karena parser mental Anda belum terbiasa. Ini akan menjadi lebih baik jika Anda hanya menggunakannya dan membacanya berulang-ulang.


Aku bahkan belum membaca bahwa banyak dari itu, tapi sekarang saya pikir itu adalah indah. Sepertinya otak saya mulai memiliki perasaan "taktil" tentang tanda kurung. Saya pikir perasaan itu hanya akan menjadi lebih tajam.
Mark C

5

Anda bisa memikirkannya sebagai semacam panggilan fungsi:

(operator operand1 operand2 ...)

Tidak ada yang istimewa tentang itu. Jika Anda membebani operator dalam C ++ (dan banyak bahasa lain yang memungkinkannya), Anda sering kali harus mendefinisikan fungsi semacam ini persis seperti itu:

MyClass operator+(MyClass const& x, MyClass const& y);

Yap, ini adalah bagaimana saya melakukannya. Jika Anda mundur dan melihat pemanggilan metode di Java, C #, dll. Mereka benar-benar hanya notasi awalan dengan tanda kurung di tempat yang sedikit berbeda: MyMethod (arg1, arg2).
nlawalker

4

Banyak bahasa menggunakan campuran awalan, infiks dan bahkan postfix.

Lisp hanya menggunakan awalan saja - secara default. Jika sin (x) intuitif dari matematika, maka (sin x) tidak jauh. Jika pindah (anjing, rumah) adalah panggilan prosedur tradisional, maka di Lisp itu hanya (pindah rumah anjing).

Lisp tidak membuat pengecualian untuk matematika dan memperlakukan +, -, * dan lainnya seperti panggilan fungsi biasa.


2

Ketika (akhirnya) "Semuanya adalah panggilan fungsi" (atau bentuk khusus, atau ekspansi makro, keduanya memiliki sintaks permukaan "panggilan fungsi") diklik, rasanya cukup alami.

Jadi, karena (= 1 2)saya membaca bahwa 'panggil angka sama dengan perbandingan pada 1 dan 2'.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.