質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.06%

コマンドラインで通るがSlimeだとエラーになる(Common Lisp)

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,470

kamuycikap

score 105

タイトルの通り、シェルでCommonLispのコードを実行する場合には動作し、EmacsのLisp開発環境であるSlimeでは、コードエラーとなってしまいます。
その理由がわかりません。

Emacsを起動し、Lispコードをバッファに表示。

;;; LTKでボタンを表示する

(ql:quickload :ltk)


;; パッケージの作成
(defpackage :ltk-btn-test
  (:use :common-lisp
        :common-lisp-user
        :ltk)
  (:export :main))

(in-package :ltk-btn-test)

(defun main ()
  (with-ltk ()
    (let ((b (make-instance
              'button
                :text "Hello World!"
                :command (lambda ()
                           (format t "button push!")
                           (setf *exit-mainloop* t)))))
      (pack b))))

(main)

この状態ででSlimeを起動し、C-c C-k すると下記のエラーが発生します。

M-- M-x slime
Lsip name : ccl
There is no package named "LTK" .
   [Condition of type CCL::NO-SUCH-PACKAGE]

Restarts:
 0: [CONTINUE] Retry finding package with name "LTK".
 1: [USE-VALUE] Find specified package instead of "LTK" .
 2: [MAKE-NICKNAME] Make "LTK" be a nickname for package "COMMON-LISP-USER".
 3: [RETRY-COMPILE-FILE] Retry compiling #P"/home/k/drp_write/lisp/src_ltk/button_sample.lisp"
 4: [SKIP-COMPILE-FILE] Skip compiling #P"/home/k/drp_write/lisp/src_ltk/button_sample.lisp"
 5: [ABORT] Abort compilation.
 --more--

Backtrace:


コマンドラインにて下記の通りにソースを読むと、LTKによるボタンが表示され、プログラムが動作します。
※画面上にはLTKライブラリによるGUIボタンが表示されています。

% ccl -l ./button_sample1.lisp

/drp_write/lisp/src_ltk 
To load "ltk":
  Load 1 ASDF system:
    ltk
; Loading "ltk"

button push!
Welcome to Clozure Common Lisp Version 1.11-r16635  (LinuxX8632)!

CCL is developed and maintained by Clozure Associates. For more information
about CCL visit http://ccl.clozure.com.  To enquire about Clozure's Common Lisp
consulting services e-mail info@clozure.com or visit http://www.clozure.com.

? 


Slimeではエラーになるのに、コマンドラインではエラーにならない理由がよくわかりません。
何故なのでしょうか?
SLIMEでの私の評価方法が間違っているのでしょうか?

以下、私のPC環境とEmacs設定を記載します。

↓↓↓

<環境>
LinuxMint18 xfce
Emacs 24.5
SLIME 2.20
LISP Clozure CL

<SLIME実行コマンド>
下記の.emacsd設定により、CommonLisp処理系を選択できるようにしています。
私はClozureCLを選択しています。

M-- M-x slime
Lsip name : ccl

<.emacsdの記述 Slime抜粋>

;;; SLIME設定

;; CommonLisp開発環境 SLIMEのセットアップ
(require 'slime)
(set-language-environment 'utf-8)
(setq slime-net-coding-system 'utf-8-unix)


;; 処理系選択
;; M-- M-x slime
;; このコマンドで処理系を選ぶことができる。
 (setq slime-lisp-implementations
       '((clisp ("/usr/bin/clisp"))
         (sbcl ("/usr/bin/sbcl"))
         (ccl ("/usr/bin/ccl"))))

;;(setq inferior-lisp-program "clisp")                   ; CommonLisp用 <-- sbclがインストールされている時はそれが優先らしい
(setq inferior-lisp-program "/usr/local/bin/ccl")        ; Clozure CL用
;;(setq load-path (cons (expand-file-name "~/.emacs.d/elisp/slime") load-path)) 20171024 MELPA管理に変更したのでコメントアウト


(require 'slime-autoloads)
;(slime-setup)
(slime-setup '(slime-fancy))

;; slime用補完機能
(require 'ac-slime)
(add-hook 'slime-mode-hook 'set-up-slime-ac)
(add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
(eval-after-load "auto-complete"
  '(add-to-list 'ac-modes 'slime-repl-mode))
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

ソースファイルの書き方の問題のような気がします。

$ ccl -l button_sample1.lisp


とするとこれはインタープリタ上へロードされ、ソース上に書かれている順に普通に実行されるのでうまくいきます。しかしながら一旦cclを起動して

(compile-file "button_sample1.lisp")

とやってみてください。同様のエラーがでると思います。compile-fileではソース上のコードは実行されるのではなくコンパイラーに解釈されコンパイルされるだけです。そのため(ql:quickload :ltk)が実行されず、後続行はLTKパッケージが存在しない状態でコンパイルされるためご質問のエラーになるのだと思います。

自分はquicklispやASDFのようなものに暗く、パッケージ(モジュール?)を記述する際のマナーがよくわかっていません。quicklisp、ASDF、あるいはそれらを全然使わない方法もあるようですが、仮にcommon-lispの昔からあった標準機能を使って対処するならこんな風に書けると思います。

;; コンパイル時にもロードが必要なのでこう書いておく
(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload :ltk))

;; パッケージの作成
(defpackage :ltk-btn-test
  ...)

(in-package :ltk-btn-test)

(defun main ()
  ...)

(main)

なお、こういう原因なのでC-c C-kする前にslime上で
CL-USER> (ql:quick-load :ltk)
とやっておいても同様にうまくいくと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/17 00:41

    >compile-fileではソース上のコードは実行されるのではなくコンパイラーに解釈されコンパイルされるだけです。そのた
    >め(ql:quickload :ltk)が実行されず、後続行はLTKパッケージが存在しない状態でコンパイルされるためご質問のエ
    >ラーになるのだと思います。

    ものすごくすっきりしました!
    確かにおっしゃるとおりです。

    C-c C-kの最初のCompileでエラーになるのですね。
    勉強になりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る