Memuat paket quicklisp untuk digunakan dalam file lisp lain

Saya telah mengunduh proyek perangkat lunak besar FriCAS yang telah saya kompilasi dari sumber dan menggunakan SBCL. Ini hanya masalah penggunaan GNU .configure - Saya seorang pemula Lisp.

Namun, untuk menambahkan beberapa fungsionalitas lebih lanjut, saya telah - dengan mengikuti petunjuk dengan sangat hati-hati - menginstal quicklisp dan beberapa paket tambahan. Sejauh ini bagus.

Inilah masalah saya: Saya mencoba mengkompilasi file cadel eksternal untuk digunakan dalam sistem. Saya perlu membuat quicklisp dan paket-paketnya terlihat oleh kompiler. Jadi saya telah menyalin file .sbclrc saya ke bagian atas file lisp saya:

#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

Saya telah mengikuti ini dengan

(eval-when (:compile-toplevel)
  (ql:quickload "f2cl-lib"))

Saya sudah menginstal f2cl-lib dengan quicklisp. Namun, kompiler saya (dalam FriCAS) segera dibatalkan

; caught ERROR:
;   READ error during COMPILE-FILE:
;   
;     Package QL does not exist.

Saya agak bingung di sini - mungkin ada sesuatu yang sepele dan jelas yang hilang, tapi seperti yang saya katakan dari sudut pandang pemula, saya tidak tahu apa itu.


person Alasdair    schedule 24.10.2015    source sumber


Jawaban (1)


Sepertinya FAQ. Lihat juga dokumentasi untuk eval-when.

Penyusun File

Ingat, kompiler file mengkompilasi formulir dan tidak mengeksekusinya. Itu hanya menghasilkan kode untuk dieksekusi nanti. Umumnya. Meskipun demikian, di Common Lisp ada beberapa pengecualian terhadap aturan ini: misalnya makro, yang digunakan dalam kode sumber, akan dijalankan oleh kompiler file. Namun Common Lisp juga memungkinkan kita memberi tahu kompiler file untuk mengeksekusi kode pada waktu kompilasi, itulah salah satu kasus penggunaan eval-when.

Contoh Anda disederhanakan

Jika Anda memiliki file:

(load "file-which-creates-package-foo")

(eval-when (:compile-toplevel)
  (foo:bar)) 

Kemudian kompiler file akan menghasilkan kode untuk memuat file, tetapi tidak akan memuat file tersebut.

Selanjutnya, kompiler file melihat bentuk kedua, di mana kompiler file diinstruksikan untuk mengeksekusi pernyataan pada waktu kompilasi (dan hanya pada waktu kompilasi), jadi (foo:bar) akan dieksekusi pada waktu kompilasi. Namun yang lebih buruk lagi: Karena kode pemuatan belum dieksekusi, paket FOO tidak diketahui, dan formulir (foo:bar) akan dibaca pada waktu kompilasi, pembaca sudah mengeluh pada waktu kompilasi< /em> bahwa paket FOO tidak ada.

Penggunaan EVAL-Kapan

Apa yang perlu Anda lakukan adalah memberi tahu kompiler file untuk benar-benar memuat hal-hal yang diperlukan selama kompilasi. File tersebut sudah berisi formulir eval-when, sehingga seharusnya memberi Anda petunjuk: gunakan eval-when. Ada tiga situasi:

  • :compile-toplevel -> kompiler file mengeksekusi formulir terlampir
  • :load-toplevel -> kompiler file menghasilkan kode sehingga kode tersebut akan dieksekusi saat memuat kode
  • :execute

Pastikan situasi tersebut disebutkan, kapan kode harus dieksekusi.

Solusi yang mungkin

Jadi ada solusi yang mungkin:

  • seperti di atas, gunakan EVAL-WHEN untuk dapat mengeksekusi formulir dengan kompiler file
  • tulis kode pemuatan ke dalam file terpisah dan kompilasi/muat file ini sebelum Anda menggunakan paket. Seseorang juga dapat menambahkan file ini ke sistem sehingga akan dimuat oleh sistem yang mengkompilasi, sebelum kode penggunaan akan dikompilasi.
person Rainer Joswig    schedule 24.10.2015
comment
Terima kasih banyak atas balasan terperinci Anda - yang sebagian besar dapat saya pahami. Saya merasa bahwa Lisp terlalu sulit bagi orang ceroboh yang tidak kompeten seperti saya; jadi aku akan mencoba sedikit lagi, lalu menyerah dengan lapang dada. - person Alasdair; 24.10.2015
comment
@Alasdair: dimungkinkan untuk mempelajarinya dan tempat-tempat seperti stackoverflow dapat membantu mengatasi masalah pemrograman. FriCAS/Axiom adalah perangkat lunak yang sangat kompleks dan memperluas implementasinya memerlukan beberapa pembelajaran. Ada juga milis untuk FriCAS, di mana seseorang dapat memperoleh bantuan lebih lanjut untuk memperluasnya. - person Rainer Joswig; 24.10.2015
comment
Oh ya - Saya telah membuat gangguan besar pada diri saya sendiri di milis FriCAS! - person Alasdair; 24.10.2015