22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Quicklispで自作モジュールを使用する

Last updated at Posted at 2014-04-01

Quicklispで自作モジュールを使用する

MOTIVATION

Quicklispのリポジトリにないライブラリを使いたい!
自作して登録するまでもないようなものや、会社でつくったやつだから外にだせないようなものなど。

やり方

Quicklispのホームディレクトリの調査

REPL上で ql:quicklisp-home を評価すると教えてくれます。

CL-USER> ql:*quicklisp-home*
#P"/home/shingo/quicklisp/"

ここの下にあるlocal-projectsというディレクトリが、自分で作ったライブラリなどを配置しておく場所になります。

展開

今回、このような構成のライブラリを登録します。

./
 src/
    my-special-lib.lisp
 t/
  my-special-lib-test.lisp
 my-special-lib.asd
 my-special-lib-test.asd
 package.lisp

local-projects下にmy-special-libというディレクトリを掘り、その下にファイルを配置していきます。
ディレクトリ名は何でも大丈夫です。深さがあっても大丈夫です。

なので、自社ライブラリ用とgithub等からダウンロードしてきた用に分ける、という運用もできます。

my-special-lib.asd
(in-package :cl-user)
(defpackage my-special-lib-asd
  (:use :cl :asdf))
(in-package :my-special-lib-asd)

(defsystem my-special-lib
  :description "sample library"
  :version "0.1"
  :author "tamura shingo"
  :license "GPL"
  :components ((:file "package")
               (:module "src"
                :components
                ((:file "my-special-lib"))))
  :in-order-to ((test-op (load-op my-special-lib-test))))
my-special-lib-test.asd
(in-package :cl-user)
(defpackage my-special-lib-test-asd
  (:use :cl :asdf))
(in-package :my-special-lib-test-asd)

(defsystem my-special-lib-test
  :description "test for my-special-lib"
  :depends-on (:my-special-lib
               :cl-test-more)
  :components ((:module "t"
                :components
                ((:file "my-special-lib-test"))))
  :perform (load-op :after (op c) (asdf:clear-system c)))
package.lisp
(in-package :cl-user)

(defpackage :my-special-lib
  (:use :cl)
  ; src/my-special-lib.lisp
  (:export :greeting))
src/my-special-lib.lisp
(in-package #:my-special-lib)

(defun greeting ()
  "hello world")
t/my-special-lib-test.lisp
(in-package :cl-user)
(defpackage my-special-lib-test
  (:use :cl
        :cl-test-more
        :my-special-lib))
(in-package #:my-special-lib-test)

(plan 1)

(ok (string= (my-special-lib:greeting) "hello world"))

(finalize)

登録

ローカルプロジェクトの登録を行います。

CL-USER> (ql:register-local-projects)
NIL

local-projectsディレクトリ下にsyystem-index.txtと言うファイルが作成されます。
中身はこんな感じです。

$ cat system-index.txt 
my-special-lib/my-special-lib.asd
my-special-lib/my-special-lib-test.asd

使う

登録が完了したらもう使える状態になっています。

CL-USER> (ql:quickload "my-special-lib")
To load "my-special-lib":
  Load 1 ASDF system:
    my-special-lib
; Loading "my-special-lib"
[package my-special-lib]
("my-special-lib")
CL-USER> (my-special-lib:greeting)
"hello world"

テストも行えます。テストにはcl-test-moreを使っています。

CL-USER> (ql:quickload "my-special-lib-test")
To load "my-special-lib-test":
  Load 1 ASDF system:
    my-special-lib-test
; Loading "my-special-lib-test"
To load "cl-test-more":
  Install 2 Quicklisp releases:
    cl-ppcre cl-test-more
; Fetching #<URL "http://beta.quicklisp.org/archive/cl-ppcre/2014-02-11/cl-ppcre-2.0.7.tgz">
; 154.47KB
==================================================
158,175 bytes in 0.83 seconds (186.33KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/cl-test-more/2014-02-11/cl-test-more-20140211-git.tgz">
; 4.07KB
==================================================
4,166 bytes in 0.00 seconds (5836.96KB/sec)
; Loading "cl-test-more"
[package cl-ppcre]................................
..................................................
..................................................
[package cl-test-more.asdf].......................
[package cl-test-more]...........
; Loading "my-special-lib-test"
[package my-special-lib-test]1..1
ok 1

("my-special-lib-test")

まとめ

  • Quicklispのリポジトリに登録されていないモジュールは local-projects 下に配置しましょう
  • その後は普通に使えます
  • Quicklispでインハウスリポジトリが使えると良いのですが。。。
22
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?