Pertanyaan Di Lisp, apa hubungan antara formulir dan file?


Saya mengalami sedikit cegukan dalam memahami Lisp. Menurut standar Common Lisp, a bentuk adalah atom atau daftar yang dimaksudkan untuk dievaluasi. Itu tampaknya cukup mudah.

Di dunia nyata, saat ini, kami menyimpan program dalam file. SBCL, Clojure, dan sejenisnya memiliki gagasan file yang juga dapat dievaluasi.

Bagaimana ini bisa dimengerti? Apakah file diperlakukan pada dasarnya seperti bentuk tunggal untuk dievaluasi, apakah itu kumpulan bentuk? Untuk beberapa alasan, ini benar-benar membingungkan saya.


4
2018-03-12 18:49


asal


Jawaban:


Menurut CLHS:

load sequentially executes each form it encounters in the file
named by filespec

yang artinya file adalah urutan bentuk.


11
2018-03-12 19:00



File adalah tempat untuk menyimpan formulir. Membuka file (dengan OPEN atau WITH-OPEN-FILE) menyediakan aliran, dan READ fungsi dapat membaca formulir dari aliran menjadi objek yang dapat dievaluasi atau dikompilasi.

Dalam Common Lisp, penting untuk menyadari bahwa semantik program didefinisikan pada objek hasil dari membaca, bukan teks yang disimpan dalam file.

http://l1sp.org/cl/3.2.3 mungkin membantu memahaminya dari perspektif kompilasi.

http://l1sp.org/cl/24.1.1 berbicara tentang beban.


6
2018-03-12 19:01



Saya mengalami sedikit cegukan dalam memahami Lisp. Menurut standar Common Lisp, bentuk adalah atom atau daftar yang dimaksudkan untuk dievaluasi. Itu tampaknya cukup mudah.

Perhatikan bahwa ini pada dasarnya berbasis data. EVAL mengambil bentuk sebagai data dan bukan teks - sebagai argumennya untuk mengevaluasi. Kita harus membaca teks terlebih dahulu untuk membuat formulir untuk EVAL. Jika kita berbicara tentang bentuk dalam file, ini pada dasarnya adalah tangan pendek untuk: bentuk-bentuk yang dibaca dari file.

Di dunia nyata, saat ini, kami menyimpan program dalam file. SBCL, Clojure, dan sejenisnya memiliki gagasan file yang juga dapat dievaluasi.

Common Lisp adalah bagian dari dunia nyata. Kode sebagian besar disimpan dalam file teks. Belum tentu begitu, tapi begitulah adanya. Itu sebabnya Common Lisp memiliki fungsi seperti OPEN, WITH-OPEN-FILE, READ, LOAD, COMPILE-FILE dan banyak lagi.

Tidak, file dalam Lisp tidak dapat 'dievaluasi'. EVAL adalah evaluator dan dibutuhkan bentuk Lisp sebagai argumen, bukan file. Dalam Lisp, file dapat dimuat. Memuat file berarti ini: membuka file untuk membaca, membaca dari file dan mengevaluasi formulir berdasarkan formulir.

File Common Lisp juga dapat dikompilasi untuk membuat file 'fasl' (fast load). Dengan sesuatu seperti SBCL, file ini akan berisi kode mesin dan data. File ini juga bisa dimuat. Pemuatan akan mengeksekusi kode yang dihasilkan untuk setiap formulir, satu per satu.

Jadi, Common Lisp dapat memuat dua jenis file: file teks dengan kode Lisp dan file FASL dengan kode yang dikompilasi.

Anda juga dapat membuka file teks untuk membaca, gunakan pembaca Lisp untuk membaca formulir dan melakukan apa pun yang Anda inginkan dengan hasilnya. Anda juga dapat membuka file teks untuk menulis dan menulis bentuk Lisp sebagai teks ke file itu.

Menyimpan kode sumber dalam file adalah praktik umum di Lisp.

Ada pengecualian untuk ini:

  • implementasi Common Lisp (tidak semua) memungkinkan kita untuk menyimpan gambar. Gambar adalah dump dari status memori saat ini dari sistem Lisp yang berjalan. Dengan demikian Anda dapat memiliki bentuk Lisp sebagai data dalam program yang sedang berjalan, lalu membuang gambar dan kemudian memulai ulang gambar. Gambar yang direstart akan tetap memiliki semua data, yang artinya kode yang disimpan sebagai data juga akan tetap ada.

  • Sesuatu seperti Interlisp-D, sistem Lisp yang tidak lagi digunakan secara luas, juga memiliki implementasi Common Lisp. Interlisp-D menyimpan kode sumber dalam file teks di bawah kendali program. Dengan demikian file teks lebih banyak digunakan seperti basis data.

  • Beberapa sistem Lisp juga mendukung pemuatan otomatis. Memanggil fungsi, fungsinya tidak diketahui, kemudian terlihat di tempat lain (database, kode sumber) untuk mencari kode sumber, memuatnya dan kemudian mencoba lagi untuk memanggil fungsi yang sekarang dikenal. Dengan cara ini tidak perlu bagi pengguna untuk memuat file, sistem Lisp melakukannya di latar belakang. Pemuatan-otomatis digunakan dalam sistem Lisp awal untuk menghemat ruang di memori utama dan tidak memuat semuanya saat itu. Bahkan implementasi Lisp yang lebih baru dapat menggunakan beberapa bentuk pemuatan otomatis untuk beberapa fungsi.


3
2018-03-13 08:14