4574


Common Lispの練習のため、sbcl(Steel Bank Common Lisp)で、簡単なスクリプトを書いてるのですが、`sbcl
--script
foobar.lisp`を実行した際に、`quicklisp`がロード出来ないというエラーが出てしまいます。このときに、`quicklisp`を利用するためには、いったいどうすればいいのでしょうか?

詳細のエラーメッセージは以下の通りです:

[code]

    Unhandled SB-C::INPUT-ERROR-IN-LOAD in thread #<SB-THREAD:THREAD
                                                    "main thread" RUNNING
                                                     {10039B67E3}>:
      READ error during LOAD:
    
        Package QL does not exist.
    
          Line: 1, Column: 12, File-Position: 12
    
          Stream: #<SB-SYS:FD-STREAM
                    for "file /home/esehara/commonlisp/foobar.lisp"
                    {10039B97B3}>
    
[/code]


CC BY-SA 3.0
2015-01-14T15:33:09.850
4570
2015-01-15T14:10:04.700
939
question
common-lisp sbcl
sbclでscriptオプションを利用したさいにquicklispが利用できなくなってしまう

[code]

    $ sbcl --noinform --quit --load foo.lisp
    
[/code]

として実行して下さい。

**追記**

ただしこの場合、shebangには使えませんので、shebangから起動する場合は --script を使う必要があります。ご注意下さい。


CC BY-SA 3.0
2015-01-14T16:07:25.217
4572
2015-01-14T16:15:29.520
2015-01-14T16:15:29.520
440
440
4570
answer


まず、原因ですが、--scriptオプションは、

[code]

    --no-userinit --no-sysinit --disable-debugger
    
[/code]

を指定しているのと同じとのことですので、ユーザーの初期化ファイルを読まず、初期化ファイルで指定しているであろうQuicklispの読み込みが行なわれない為です。

  * <http://www.sbcl.org/manual/index.html#Shebang-Scripts>

これを避けるには他の方も回答しているように--loadオプションを使ってしまうことが考えられます。

他の選択肢としては、Quicklispを読み込んでしまったイメージをダンプして使うことも考えられます。  
SBCLだと、実行可能ファイルが作成できますので、下記のようにしてQuicklisp込みのsbclを作成してしまえば可能です。

ダンプ方法

[code]

    (cl:progn
      ;; .sbclrc に書かれている内容
      (cl:let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                                (user-homedir-pathname))))
        (cl:when (cl:probe-file quicklisp-init)
          (cl:load quicklisp-init)))
    
      ;; Quicklispが読み込み済みの実行可能ファイルをsbqlとして作成
      (sb-ext:save-lisp-and-die "sbql" :purify t :executable t))
    
[/code]

スクリプト例

[code]

    (defun fib (n)
      (if (< n 2)
          n
        (+ (fib (1- n))
           (fib (- n 2)))))
    
    ;; 最近のQuicklispにはsilentオプションが付いた。
    (ql:quickload :cl-ppcre :silent t)
    
    (print (fib 30))
    (terpri)
    
[/code]

-
[code]

    $ ./sbql --script ./fib.lisp                        
    
    832040
    
[/code]

下記のように、shebangスクリプトにすることも可能です。

[code]

    #!/usr/local/bin/sbql --script
    
[/code]

イメージのダンプというと面倒臭そうな印象がありますが、実際はそれ程のことでもありませんし、こちらの方が手軽なこともあります。


CC BY-SA 3.0
2015-01-14T22:17:27.053
4574
2015-01-14T22:17:27.053
3510
4570
answer


前の方も書いていますが、homedir下の.sbclrcファイルが読み込まれていないのが原因です。  
したがって、.sbclrcを読み込んでやれば、うまくいきます。

[code]

    (load (merge-pathnames
             (make-pathname
              :name ".sbclrc")
             (user-homedir-pathname)))
    
[/code]


CC BY-SA 3.0
2015-01-15T14:10:04.700
4636
2015-01-15T14:10:04.700
5970
4570
answer