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

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

新規登録して質問してみよう
ただいま回答率
85.49%
LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

Q&A

解決済

1回答

2877閲覧

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

kamuycikap

総合スコア135

LISP

LISPはプログラミング言語の一種であり、関数型言語に分類されています。 特徴として、括弧を多様する独特の構文を持ちます。

0グッド

1クリップ

投稿2018/03/15 22:31

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

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

lisp

1;;; LTKでボタンを表示する 2 3(ql:quickload :ltk) 4 5 6;; パッケージの作成 7(defpackage :ltk-btn-test 8 (:use :common-lisp 9 :common-lisp-user 10 :ltk) 11 (:export :main)) 12 13(in-package :ltk-btn-test) 14 15(defun main () 16 (with-ltk () 17 (let ((b (make-instance 18 'button 19 :text "Hello World!" 20 :command (lambda () 21 (format t "button push!") 22 (setf *exit-mainloop* t))))) 23 (pack b)))) 24 25(main) 26 27 28

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

M-- M-x slime Lsip name : ccl

slime

1There is no package named "LTK" . 2 [Condition of type CCL::NO-SUCH-PACKAGE] 3 4Restarts: 5 0: [CONTINUE] Retry finding package with name "LTK". 6 1: [USE-VALUE] Find specified package instead of "LTK" . 7 2: [MAKE-NICKNAME] Make "LTK" be a nickname for package "COMMON-LISP-USER". 8 3: [RETRY-COMPILE-FILE] Retry compiling #P"/home/k/drp_write/lisp/src_ltk/button_sample.lisp" 9 4: [SKIP-COMPILE-FILE] Skip compiling #P"/home/k/drp_write/lisp/src_ltk/button_sample.lisp" 10 5: [ABORT] Abort compilation. 11 --more-- 12 13Backtrace: 14

コマンドラインにて下記の通りにソースを読むと、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抜粋>

lisp

1;;; SLIME設定 2 3;; CommonLisp開発環境 SLIMEのセットアップ 4(require 'slime) 5(set-language-environment 'utf-8) 6(setq slime-net-coding-system 'utf-8-unix) 7 8 9;; 処理系選択 10;; M-- M-x slime 11;; このコマンドで処理系を選ぶことができる。 12 (setq slime-lisp-implementations 13 '((clisp ("/usr/bin/clisp")) 14 (sbcl ("/usr/bin/sbcl")) 15 (ccl ("/usr/bin/ccl")))) 16 17;;(setq inferior-lisp-program "clisp") ; CommonLisp用 <-- sbclがインストールされている時はそれが優先らしい 18(setq inferior-lisp-program "/usr/local/bin/ccl") ; Clozure CL用 19;;(setq load-path (cons (expand-file-name "~/.emacs.d/elisp/slime") load-path)) 20171024 MELPA管理に変更したのでコメントアウト 20 21 22(require 'slime-autoloads) 23;(slime-setup) 24(slime-setup '(slime-fancy)) 25 26;; slime用補完機能 27(require 'ac-slime) 28(add-hook 'slime-mode-hook 'set-up-slime-ac) 29(add-hook 'slime-repl-mode-hook 'set-up-slime-ac) 30(eval-after-load "auto-complete" 31 '(add-to-list 'ac-modes 'slime-repl-mode)) 32

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

bash

1$ ccl -l button_sample1.lisp

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

(compile-file "button_sample1.lisp")

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

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

lisp

1;; コンパイル時にもロードが必要なのでこう書いておく 2(eval-when (:compile-toplevel :load-toplevel :execute) 3 (ql:quickload :ltk)) 4 5;; パッケージの作成 6(defpackage :ltk-btn-test 7 ...) 8 9(in-package :ltk-btn-test) 10 11(defun main () 12 ...) 13 14(main)

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

投稿2018/03/16 04:00

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamuycikap

2018/03/16 15:41

>compile-fileではソース上のコードは実行されるのではなくコンパイラーに解釈されコンパイルされるだけです。そのた >め(ql:quickload :ltk)が実行されず、後続行はLTKパッケージが存在しない状態でコンパイルされるためご質問のエ >ラーになるのだと思います。 ものすごくすっきりしました! 確かにおっしゃるとおりです。 C-c C-kの最初のCompileでエラーになるのですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問