

`~/.xyzzy.d` 配下にある lisp ファイルを全て起動時に読み込むために

[code]

    (mapcar #'mc-load-file (directory "~/.xyzzy.d/" :absolute t :wild "*.l"))
    
[/code]

と記述していたのですが、久しぶりにxyzzyを使ってみると読み込まなくなってしまっていました。  
`C-x C-e`で該当行を実行すると `(t t t t t t t t t)`とエラー無く終了しているのですがファイルの読み込みができていません。

また `(directory "~/.xyzzy.d/" :absolute t :wild "*.l")` を interactive-mode
で実行し、結果のリストをそのまま `(mapcar #'mc-load-file list)`
の引数として渡すと同様にエラー無く終了し、読み込みが行われているようです。

作業前にダンプファイルは削除して確認しており、xyzzyのバージョンは `0.2.2.252` を使用しています。

何が原因で正常に読み込みが行えないのでしょうか？

一月ほど前に外部のQ&AサービスTeratailに質問させてもらっていたのですが、回答がもらえませんでしたのでこちらで再質問しております。  
<https://teratail.com/questions/4565>

### 2015/01/16 追記

`~/.xyzzy.d/foo.l`を作成して以下の記述をすると`error!`とダイアログボックスは表示されるのですが、`M-x foo`
としても関数を見つけることができませんでした。一度宣言した関数が無効化されてしまっているのでしょうか？

[code]

    (defun foo ()
      (interactive)
      (message "foo!!")
      )
    (error "error!")
    
[/code]


CC BY-SA 3.0
2015-01-14T21:30:07.623
4573
2015-01-19T15:59:36.090
2015-01-16T03:42:25.160
3271
3271
question
common-lisp lisp xyzzy
xyzzy で ~/.xyzzy.d/ 以下の lispファイルを全てロードする方法


xyzzy 0.2.2.252で確認しましたが、下記のコードで、.xyzzy.d/以下のファイルは読み込めるようでした。

[code]

    (mapcar #'mc-load-file (directory "~/.xyzzy.d/" :absolute t :wild "*.l"))
    
[/code]

原因が分かりませんので、問題の切り分け方法だけ提案したいと思います。

# 初期化ファイルが読み込まれていない可能性

初期化ファイルに、

[code]

    (error "初期化ファイル!!")
    
[/code]

を書きxyzzyを起動します。  
ここで、初期化ファイル!! と出てこなければ、初期化ファイルが読み込まれてません。

# ファイルが読み込まれていない可能性

これで問題なければ、errorのコードは削除し、  
次に、.xyzzy.d以下に、foo.lというファイルを作成し、

[code]

    (error "foo!!")
    
[/code]

xyzzyを起動し、foo!!という表示がなければ、読み込まれておらず、出れば読み込まれています。

こんな風に、読み込みたいファイルにerrorを書き込んでどこまで読み込んでいるかを、一歩づつ確認する位しかないのではないでしょうか。


CC BY-SA 3.0
2015-01-15T00:24:53.790
4578
2015-01-15T00:24:53.790
3510
4573
answer


回答ではありませんが、lisp ファイルの該当部分を眺めてみました。

`xyzzy/lisp/misc.l`

[code]

    (defun mc-load-file (filename &optional encoding)
                       :
      (ed:save-excursion
        (setq buffer (ed:create-new-buffer " *load file*"))
        (ed:set-buffer buffer)
        (let ((ed:*expected-fileio-encoding*
                (or encoding
                  (ed::find-file-auto-encoding filename)
                  ed:*expected-fileio-encoding*)))
          (declare (special ed:*expected-fileio-encoding*))
          (ed:message "~A ~A..." loading filename)
          (ed:insert-file-contents filename)
          (load (ed:make-buffer-stream buffer) :verbose nil)
          (ed:message "~A ~A...done" loading filename)))
      (when buffer
        (ed:delete-buffer buffer)))))
    
[/code]

load の前後に、`(ed:message ...)` があるのですが、xyzzy のミニバッファに `LOADING ...`
と表示されているならロードが実行されているはずです。ここで、`loading ...`
と小文字で表示されている場合はバイトコンパイル済のリスプファイル(*.lc)がロードされていることになります。


CC BY-SA 3.0
2015-01-15T12:45:21.820
4620
2015-01-15T12:45:21.820
4573
answer


foo.lの `(error "error!")` が実行されているとすると、コマンド関数fooは  
userパッケージではないどこか別のパッケージ内に定義されてしまっている可能性があります。  
`M-x`からパッケージ修飾子ナシで起動出来るコマンドは

  * userパッケージからuse-packageしているパッケージ(初期状態ではlispとeditor)からエクスポートされているコマンド関数
  * userパッケージ内で定義されたコマンド関数

つまりuserパッケージからパッケージ修飾子ナシでアクセスできるシンボルにバインドされているコマンド関数に限られます。

例えば以下のようなbar.lと  

[code]

    (in-package :user)
    (defun bar ()
      (interactive)
      (message "bar"))
    
[/code]

baz.lがあるとして

[code]

    (defun baz ()
      (interactive)
      (message "baz"))
    
[/code]

.xyzzyには以下のようにロードするコードを書くと

[code]

    (in-package :editor)
    (require "bar")
    (require "baz")
    
[/code]

関数`bar`は`user`パッケージで定義されるので`M-x bar`で起動できますが、  
関数`baz`はロード元のカレントパッケージ`editor`内で定義される事になりますので、  
`M-x ed::baz`と入力しないと起動できません。  
(in-package関数でのカレントパッケージ指定は現在ロード中のファイル内で有効です。)

editorパッケージ内で定義したいけど`ed::`ナシで起動したい場合は、

[code]

    (in-package :editor)
    (export '(baz))
    
    (defun baz ()
      (interactive)
      (message "baz"))
    
[/code]

のように書いてシンボルbazをeditorパッケージからエクスポートする必要があります。

というわけで、.xyzzyの中で目的のファイルがロードされるまでにカレントパッケージがuser以外の物に変更されていないか調べてみてください。  
(.xyzzy先頭のカレントパッケージはsiteinit.lの内容にかかわらずuserパッケージだったと思います)

また、初期化ファイルからロードするファイルは、ロード元のカレントパッケージに影響されないようにファイル先頭の方でin-
package関数でパッケージを指定しておくと良いでしょう。


CC BY-SA 3.0
2015-01-19T15:59:36.090
4860
2015-01-19T15:59:36.090
7559
4573
answer