Le site personnel de Said Abdouni

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 :

Avec CommonQt

1. Installation de CommonQt

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)))