Apa yang harus saya pelajari dari Skema?

10

Saya bertanya-tanya fitur unik apa yang dapat saya pelajari dari Skema yang akan membantu saya menjadi programmer yang lebih baik?

Saya memiliki banyak pengalaman dalam bahasa umum, dan saya ingin memperluas wawasan saya dan belajar tentang aspek fungsional yang hilang dari bahasa lain. Saya kenal dengan penutupan dari javascript, ekspresi lambda dari C #, dan saya bertanya-tanya apa yang bisa saya fokuskan yang kurang dalam bahasa lain? Selain sintaks Lisp, saya merasa seperti apa yang telah saya lihat sejauh ini yang telah saya temui dalam bahasa lain.

Apa yang unik dari Skema / Lisp yang akan mengajari saya sesuatu yang baru?

bunglestink
sumber
3
Lisp layak dipelajari untuk pengalaman pencerahan mendalam yang akan Anda miliki ketika Anda akhirnya mendapatkannya; pengalaman itu akan membuat Anda menjadi programmer yang lebih baik untuk sisa hari-hari Anda, bahkan jika Anda tidak pernah benar-benar menggunakan Lisp sendiri. - Eric Raymond
Robert Harvey
1
Juga: xkcd.com/297
Robert Harvey
1
@Robert Harvery: Juga: xkcd.com/224
Poindexter
2
Dalam bentuk saat ini, pertanyaan ini tidak terlalu konstruktif. Jika Anda dapat mengolahnya kembali untuk meminta informasi yang lebih spesifik, itu mungkin berguna.
ChrisF
Lihat juga Mengajar Bahasa Pemrograman di Zaman Pasca Linnaean , dan buku teks yang menjadi referensi makalah ini: Bahasa Pemrograman: Aplikasi dan Interpretasi , yang menggunakan Bahasa Racket , dialek Skema.
Robert Harvey

Jawaban:

7

Mungkin karakteristik pendefinisian Lisp yang paling penting adalah "Code as Data."  Anda tidak akan mendapatkan pengalaman itu dengan cara yang sama dengan bahasa lainnya. Dalam C #, analog terdekat adalah pohon ekspresi.

Kualitas itulah yang membuat Lisp bahasa yang sangat baik untuk parsing. Itu juga kualitas yang memotivasi Paul Graham untuk mengatakan tentang Lisp: "Hal yang tidak biasa tentang Lisp - pada kenyataannya, kualitas menentukan Lisp - adalah bahwa hal itu dapat ditulis sendiri." Meskipun self-hosting compiler bukanlah hal yang baru, tidak ada bahasa yang melakukannya dengan elegan seperti Lisp.

Metaprogramming (sesuatu yang Lisp juga unggul) juga merupakan hal yang berharga untuk dipelajari.

Beating the Averages oleh Paul Graham
http://www.paulgraham.com/avg.html

Robert Harvey
sumber
1
Saya pikir alasan saya tidak pernah memiliki "aha!" ESR saat itu berjanji kepada saya adalah bahwa saya sudah memiliki wahyu "kode sebagai data" di Prolog.
Frank Shearar
1
Apakah Haskell memiliki atribut "kode sebagai data"? Atau apakah keindahan sangat bergantung pada pengetikan dan refleksi dinamis?
Joey Adams
1
@ Joey: Saya pikir fakta bahwa Template Haskell ada berarti Haskell tidak memiliki atribut "kode sebagai data".
j_random_hacker
4

Ya, ini akan membantu Anda berpikir secara rekursif. Saya hanya mempelajarinya (skema) selama sebulan atau lebih di kelas bahasa pemrograman dan itu membantu saya mengembangkan cara saya berpikir dan menyelesaikan masalah pemrograman.

Itu selalu berharga untuk mencoba paradigma pemrograman lain; Anda kemudian kembali dengan segar ke dunia OO dengan ide-ide baru.

Bukan sintaks, tetapi alasannya, ini adalah latihan otak yang hebat. Appart dari rekursi dan penggunaan daftar yang menarik, tidak ada banyak IMHO, tetapi sangat berharga.

dukeofgaming
sumber
Tidak unik untuk skema. Setiap (baik, hampir semua) bahasa fungsional baik untuk melakukan rekursi.
Saya setuju, tetapi OP tampaknya tertarik pada Skema dibandingkan dengan bahasa 'mainstream' ....
Xavier Nodet
1

Kelanjutan :

Dalam ilmu komputer dan pemrograman, kelanjutan adalah representasi abstrak dari status kontrol program komputer. Kelanjutan menentukan status kontrol program, yaitu kelanjutan adalah struktur data yang mewakili proses komputasi pada titik tertentu dalam pelaksanaan proses; struktur data yang dibuat dapat diakses oleh bahasa pemrograman, bukannya disembunyikan di lingkungan runtime. Ini berisi informasi seperti proses 'tumpukan saat ini (termasuk semua data yang masa pakainya dalam proses misalnya "variabel lokal"), serta titik proses' dalam perhitungan. Contoh kelanjutan dapat kemudian digunakan sebagai struktur kontrol; setelah doa, itu akan melanjutkan eksekusi dari titik kontrol yang diwakilinya. "Kelanjutan saat ini"

dan kemudian mencoba mengimplementasikan Operator Ambigu McCarthy :

Pada tahun 1963 John McCarthy, penemu Lisp, menerbitkan makalah A Basis untuk Teori Matematika Komputasi di mana ia mengusulkan fungsi (dalam arti program komputer kata) amb (.,.). Idenya adalah bahwa amb (x, y) pertama sama dengan x. Tetapi jika kemudian dalam perhitungan ditemukan bahwa ini mengarah pada semacam kontradiksi nilai x ditarik dan diganti dengan y. Ini adalah bisnis yang jauh lebih kompleks daripada yang mungkin terlihat pada awalnya. Menarik kembali suatu nilai pada dasarnya berarti mengembalikan seluruh keadaan perhitungan ke tempat itu ketika amb mengembalikan nilai x, dan kemudian menyelipkan nilai y. Ini berarti entah bagaimana membekukan dan menyalin seluruh negara ketika x pertama kali dikembalikan. Ketika sebuah kontradiksi ditemukan, seluruh status program dibuang dan diganti dengan versi beku yang diaktifkan kembali. Keadaan beku ini dikenal sebagai kelanjutan. Dalam banyak hal itu seperti pernyataan GOTO tentang asam. Ini dapat menyebabkan lompatan ke tempat acak pada kode Anda. Tetapi kelanjutan lebih baik daripada GOTO karena mereka lebih bisa menerima alasan logis.

knivil
sumber
1

Saya dapat memikirkan hal-hal berikut:

  • Makro nyata (menggunakan kekuatan penuh bahasa untuk menghasilkan kode)
  • Homoiconicity (data sebagai kode, kode sebagai data)
  • Evaluasi malas
  • Lanjutan

Saya juga berpikir bahasa lisp harus luar biasa untuk mendefinisikan bahasa spesifik domain (DSL). Itu adalah sesuatu yang mungkin ingin Anda baca jika Anda belum mengetahuinya.

Joanis
sumber