Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

エディタからのevalの際のカレントパッケージを*package*そのものではなく*buffer-package*をベースにした。 #258

Closed
wants to merge 1 commit into
from

Conversation

Projects
None yet
2 participants
Contributor

snmsts commented May 4, 2012

付随してset-packageコマンドの定義

_lisp-interaction-mode-package_を用意するよりは影響範囲がでかい事が多少懸念です。
eval-expressionはuserパッケージに固定した方が「エディタ」として利用する人には便利かもしれません…

Owner

x022235 commented May 4, 2012

この変更の背景を教えて欲しいです。

#88*lisp-interaction-mode-package* は微妙だから *buffer-package* を使えということでしょうか?
それとも eval-region するときにマジックコメントで指定したパッケージを解釈して欲しいということでしょうか?

開いているファイルによってパッケージが変わる可能性があるのはトラブルのもとになりそうなので、
eval-expression では *buffer-package* は見ないほうがいい気がします。

Contributor

snmsts commented May 4, 2012

ありがとうございます。

背景はあまり考えていませんでしたが、slimeでの生活に慣れて帰ってきた感じなので、
そちらの(経験的に便利だと思っている)設定に寄せたいという意図があるかもです。

_lisp-interaction-mode-package_についてはどちらかというと後者です。
lispの書かれたファイルをちょっと開いてささっとevalして閉じるのがeval-regionの主な利用な気がするので…

eval-expressionについてはまだ多少迷いがありつつも同意です。
一緒に書いたset-packageに一貫した効果を持たせたいというあたりなのですが非互換性ですね。

Owner

x022235 commented May 4, 2012

以下の 2 つの話があるのかなと思いました。

  • eval-region 時に現在のパッケージで評価して欲しい
  • lisp-interaction-mode や eval-expression で :cl-user を使いたい (#88)

とりあえず eval-region の件は #260 に入れておきました。

in-package → *buffer-package**lisp-interaction-mode-package* 相当の何か → *package*
の順でパッケージを決めるのが良いかなと思っていますがどうでしょうか。
#slime は in-package は見てくれます?

あと、*lisp-interaction-mode-package* は print 時のパッケージを変えていなかったのと、
eval-expression のことを考えていなくて微妙だったのでとりあえず revert しました。

Contributor

snmsts commented May 4, 2012

なるほど、あまりちゃんと考えていないので、cl-userを使いたいの意図はあまり理解していませんでした。
clユーザならそちらに倒したい事もあるかもですね。

slimeのデフォルトはバッファ先頭から舐めた先頭のin-packageを採用するので挙動としてはlppの方が賢い印象があります。
ただし、そこまで動的な挙動をin-packageを探す関数をデフォルトに採用してしまうと
特に今までの話の流れでlisp-interaction-modeでin-packageを探されてしまっても寂しいような気がするので、

何かのhook -> buffer-package -> package
という順序が良いような気がしています。

そして_lisp-interaction-mode-package_相当はlisp-interaction-modeがアクティブになるときに、
新しい変数を採用するhook関数をひっかけるのが良いかと思います。

Owner

x022235 commented May 4, 2012

あ、なるほど。フックいいですね。
その線で直してもらえるとありがたいです。

Contributor

snmsts commented May 5, 2012

勘違いをしているといけないと思ってslimeの調査をしてきました。
そして勘違いをしておりました:)

slime自体のpackage決定の順序は
slime-buffer-packageというローカル変数-> slime-find-buffer-package-function変数に代入された関数を呼んだ結果
(デフォルトの関数は正規表現検索でin-packageをバッファの先頭方向に検索して失敗したら終端方向に検索)
となっているようです。マジックコメントでslime-buffer-packageなんてものが指定される事はまず無いので、
ときたまpackageが指定されているxyzzyでフックとバッファローカル変数のどちらが優先的になるべきなのかは
迷う所かと思いました。個人的には_buffer-package_優先で良いかな…と思いましたが判断を仰ぎたいと思います。

よろしくお願いします。
直すのは了解です。

@snmsts snmsts closed this May 6, 2012

@x022235 x022235 was assigned May 6, 2012

プロンプトはコロンの後にスペースが欲しいです。

Owner

snmsts replied May 6, 2012

了解。

他のソースでは hook 変数はすべて nil で初期化しているので nil がよいです。
#実質同じなのですが一貫性という意味で。

Owner

snmsts replied May 6, 2012

了解。すみません。

以下の点が気になります。

  • 同じ正規表現が2箇所に出てくる
    • defparameter してもいいと思います
  • cl:in-package とも書ける
    • (?:(?:lisp|cl|common-lisp)::?)?in-package ですかね
  • 文字列やコメント中に in-package があった場合
    • parse-point-syntax を見る?
Owner

snmsts replied May 6, 2012

  • 二箇所に出てくる
    • defvarしてみました。破壊されると困るはずのprotect-match-dataも忘れてました。
  • in-packageの表現
    • 正規表現の訂正ありがとうございます。修正します。
  • 文字列中やコメント
    • どうしましょうか…とりあえず解決せねば取り込めないという方針な場合は考えますが、気は進みません。
      割と沼ではないかと。slimeでの関数は行頭マッチの^がついていますがsyntaxは関係ないみたいです。
      行頭であるという制約は完璧だとは全く思わないのですが普段使いの印象として妥当だと思うのでとりあえずそちらの方向へ。

行頭であるという制約は完璧だとは全く思わないのですが普段使いの印象として妥当だと思うのでとりあえずそちらの方向へ。

あ、これで必要十分だと思います。

Owner

snmsts replied May 6, 2012

了解

  • run-hook-with-args-until-success で書けそうです
  • フックでエラーが発生した場合、評価自体ができなくなってしまうので、
    ignore-errors しておいたほうがよさそうです

追加で。

  • フックがパッケージ以外 (文字列やシンボル) を返した場合や、
    パッケージ名の大文字・小文字の違いなどがあっても動いて欲しいと思います
  • フックがパッケージに変換できないようなものを返した場合は
    無視して欲しいです(今はエラーになって評価できないです)
Owner

snmsts replied May 6, 2012

パッケージ名の大文字小文字に対応するコードを入れてみましたがxyzzyのようなcase-sensitveなlispにおいて
これで良いのかどうかは少し迷いますね。
(defpackage :User)とかでuserパッケージが見えなくなりそうな予感を含んでいるので余裕がある時にちゃんとします。

この後の print するときにも *package* を変えないと、
以下のように出力結果にパッケージがついてしまいます。

(in-package :cl-user)
(defun hoge ())
common-lisp-user::hoge

リファレンスまで書いていただいてありがとうございます。

  • 239 に入れたいと思うので、239? の ? は無くしてください
  • ついでに etc/lisp にも *find-buffer-package-hook* を追加しておいて欲しいです
  • リファレンスとキーワードファイルはコミットを分けておいてもらえると
    マルチフレーム版などで cherry-pick しやすくなります
Owner

snmsts replied May 6, 2012

ありがとうございますgit初心者なのでいろいろ至っていない感じが…

  • ?は取りました
  • etc/lispに追加*find-buffer-package-hook*set-buffer-package ところでこれをビルド時に生成しない理由ってありますか?
  • cherry-pick なるほど以後気をつけます。

etc/lispに追加_find-buffer-package-hook_とset-buffer-package ところでこれをビルド時に生成しない理由ってありますか?

理由は確か以下のような感じですね。

  • xy-reference で symlist とキーワードの一覧を生成するのに結構時間がかかった記憶がある
  • xy-reference のライセンスが不明で手が出せなかった (ちょうど作者さんが^^)
  • xy-reference 相当を再実装するコストより、キーワードファイルに数行追加するコストのほうが小さそう

自動生成できるようにするのはありだと思います。
#ついでに builtin.l も更新するのをよく忘れるのでなんとかしたいですね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment