Common Lisp
Installer et configurer Common Lisp pour Emacs
Dans le shell, installer sbcl :
sudo apt install sbcl wget http://beta.quicklisp.org/quicklisp.lisp sbcl --load quicklisp.lisp
Dans sbcl:
(quicklisp-quickstart:install)
(ql:quickload "quicklisp-slime-helper")
Dans Emacs, ajouter ces lignes dans le fichier de configuration d'Emacs
(load (expand-file-name "~/quicklisp/slime-helper.el")) (setq inferior-lisp-program "/usr/bin/sbcl")
Lancer le REPL lisp avec Alt-x slime
Créer un exécutable
Exemple de fichier à compiler (hello.lisp) :
(defun main () (format t "hello world"))
Dans le shell (ne pas utiliser slime pour créer les exécutables):
sbcl --load hello.lisp
Dans le REPL :
(sb-ext:save-lisp-and-die "hello" :toplevel #'main :executable t)ou "hello.exe" si sous Windows.
Quitter proprement sbcl
Dans le Shell (REPL):
(sb-ext:quit)
Sur Emacs (Slime):
Dans le buffer du REPL, tapez ,
(une vergule
) qui vous place dans le minibufer, tapez alors quit
.
Interface graphique
Avec GTK
1. Installer cl-cffi-gtk
:
- Clonez
git clone https://github.com/crategus/cl-cffi-gtk.git
- Allez au répertoire
~/.sbcl/systems
(créez-les s’ils n’existent pas)
- Créez les liens symboliques suivants :
ln -s /Chemain/vers/cl-cffi-gtk/gtk/cl-cffi-gtk.asd
ln -s /Chemain/vers/cl-cffi-gtk/gdk/cl-cffi-gtk-gdk.asd
ln -s /Chemain/vers/cl-cffi-gtk/gobject/cl-cffi-gtk-gobject.asd
ln -s /Chemain/vers/cl-cffi-gtk/glib/cl-cffi-gtk-glib.asd
ln -s /Chemain/vers/cl-cffi-gtk/pango/cl-cffi-gtk-pango.asd
ln -s /Chemain/vers/cl-cffi-gtk/cairo/cl-cffi-gtk-cairo.asd
ln -s /Chemain/vers/cl-cffi-gtk/gdk-pixbuf/cl-cffi-gtk-gdk-pixbuf.asd
ln -s /Chemain/vers/cl-cffi-gtk/gio/cl-cffi-gtk-gio.asd
cl-cffi-gtk
dépend aussi de ces librairies (à installer avec asdf
):
(ql:quickload "cffi")
(ql:quickload "trivial-garbage")
(ql:quickload "iterate")
(ql:quickload "bordeaux-threads")
(ql:quickload "closer-mop")
2. Une première fenêtre :
- Créer un fichier premiergtk.lisp :
(eval-when (:compile-toplevel :load-toplevel :execute)
(require "asdf"))
(setf asdf:*central-registry*
(list* '*default-pathname-defaults*
#p"/home/said/.sbcl/systems/"
asdf:*central-registry*))
(asdf:load-system :cl-cffi-gtk)
(defpackage :gtk-tutorial
(:use :gtk :gdk :gdk-pixbuf :gobject
:glib :gio :pango :cairo :common-lisp))
(in-package :gtk-tutorial)
(defun premiere-fenetre ()
(within-main-loop
(let (;; Create a toplevel window with a title and a default width.
(window (make-instance 'gtk-window
:type :toplevel
:title "Première Fenêtre"
:default-width 250)))
;; Signal handler for the window to handle the signal "destroy".
(g-signal-connect window "destroy"
(lambda (widget)
(declare (ignore widget))
(leave-gtk-main)))
;; Show the window.
(gtk-widget-show-all window))))
(premiere-fenetre)
Lancer le REPL :
sbcl --load premiergtk.lisp
3. Crédits/External links :
- https://www.reddit.com/r/learnlisp/comments/4hj29i/sbcl_file_running_correctly_when_loaded_but_not/
- https://github.com/crategus/cl-cffi-gtk/blob/master/INSTALL
- http://www.crategus.com/books/cl-gtk/gtk-tutorial_2.html
Avec CommonQt
1. Installation de CommonQt
git clone https://github.com/crategus/cl-cffi-gtk.git
~/.sbcl/systems
(créez-les s’ils n’existent pas)ln -s /Chemain/vers/cl-cffi-gtk/gtk/cl-cffi-gtk.asd ln -s /Chemain/vers/cl-cffi-gtk/gdk/cl-cffi-gtk-gdk.asd ln -s /Chemain/vers/cl-cffi-gtk/gobject/cl-cffi-gtk-gobject.asd ln -s /Chemain/vers/cl-cffi-gtk/glib/cl-cffi-gtk-glib.asd ln -s /Chemain/vers/cl-cffi-gtk/pango/cl-cffi-gtk-pango.asd ln -s /Chemain/vers/cl-cffi-gtk/cairo/cl-cffi-gtk-cairo.asd ln -s /Chemain/vers/cl-cffi-gtk/gdk-pixbuf/cl-cffi-gtk-gdk-pixbuf.asd ln -s /Chemain/vers/cl-cffi-gtk/gio/cl-cffi-gtk-gio.asd
cl-cffi-gtk
dépend aussi de ces librairies (à installer avec asdf
):
(ql:quickload "cffi") (ql:quickload "trivial-garbage") (ql:quickload "iterate") (ql:quickload "bordeaux-threads") (ql:quickload "closer-mop")
(eval-when (:compile-toplevel :load-toplevel :execute) (require "asdf")) (setf asdf:*central-registry* (list* '*default-pathname-defaults* #p"/home/said/.sbcl/systems/" asdf:*central-registry*)) (asdf:load-system :cl-cffi-gtk) (defpackage :gtk-tutorial (:use :gtk :gdk :gdk-pixbuf :gobject :glib :gio :pango :cairo :common-lisp)) (in-package :gtk-tutorial) (defun premiere-fenetre () (within-main-loop (let (;; Create a toplevel window with a title and a default width. (window (make-instance 'gtk-window :type :toplevel :title "Première Fenêtre" :default-width 250))) ;; Signal handler for the window to handle the signal "destroy". (g-signal-connect window "destroy" (lambda (widget) (declare (ignore widget)) (leave-gtk-main))) ;; Show the window. (gtk-widget-show-all window)))) (premiere-fenetre)
Lancer le REPL :
sbcl --load premiergtk.lisp
Dans SBCL :
(ql:quickload :qt-libs)
qui va s’assurer que toute les librairies nécessaires soient présentes, puis
(ql:quickload :qt)
qui va installer CommonQt.
2. Première fenêtre :
(ql:quickload :qt) (in-package :qt) (named-readtables:in-readtable :qt) (defclass hello-world-app () () (:metaclass qt-class) (:qt-superclass "QWidget")) (defmethod initialize-instance :after ((instance hello-world-app) &key) (new instance) (#_setGeometry instance 200 200 300 300) (#_setWindowTitle instance "Hello World!")) (make-qapplication) (with-main-window (window (make-instance 'hello-world-app)))