ラムダをデエイリアスする方法は?


8

私は私の.emacsにこれを持っています:

(defalias 'λ 'lambda)

これは、のような単純なものでは問題なく機能し(funcall (λ (x) x) 1)ます。

しかし、(org-add-link-type "foo" (λ (s) (message s)))またはのようなことをすると(add-to-list 'auto-mode-alist '("foo" . (λ () (message "bar"))))、それは機能せず、

org-open-at-point:無効な関数:(λ(s)(message s))

そして

ファイルモード指定エラー:(無効な機能(λnil(メッセージ "bar")))

それぞれ。

誰かがここで何が悪いのか知っていますか?


4
質問への答えではないdefalias、しかし、あなたがチェックアウトする場合がありますprettify-symbols-mode他のもののうち、あなたが表示できるようになる、lambdaλ実際に基本となるテキストを変更せず。
ダン

(に)のみ を飾る単純なライブラリ:。lambdaλpretty-lambdada.el
2014

きれいなシンボルだけが必要な場合は、github.com
akatov /

回答:


11

redditのlunaryornからの助けを借りて、私があなたが「奇妙な」行動を観察している理由を理解できたと思います。

問題は、式を引用していることです

'("foo" . (λ () (message "bar")))

これはフォームに相当します

(cons "foo" '(λ () (message "bar")))

emacsが拡張子 "foo"のファイルを開くと、次のようになります。

(funcall '(λ () (message "bar")))

余分な引用に注意してください、前に、これは明らかに有効な関数ではなく、エラーが発生しますが、Invalid function: ... なぜ機能するのか("foo" . (lambda () (message "bar")))、これはlunaryornの観察によって説明されています

「ラムダリスト」、つまり車がラムダ​​であるリストも有効な関数です

'(lambda () (message "bar"))有効な関数なので、これは次のコードで確認できます

(functionp (lambda () "hello"))  => t
(functionp (λ () "hello"))       => t
(functionp '(lambda () "hello")) => t
(functionp '(λ () "hello"))      => nil

したがって、解決策は、式を単に引用しないで、代わりに次を使用することです

(add-to-list 'auto-mode-alist (cons "foo" (λ () (bar))))

徹底解説ありがとうございます!すべて
正常に

3

問題はにあるのではdefaliasなく、どこでどのように呼び出してλいるのかというようです。 funcallはその引数として関数とその関数の引数を取るため、funcall例は問題なく動作します。

両方org-add-link-typeauto-mode-alist、しかし、関連する機能が含まれているシンボルを期待しています。したがって、例を基にして、以下が機能するはずです。

(defun a-silly-fnx (s)
  (message s))
(defalias #'my-link-alias #'a-silly-fnx)
(org-add-link-type "foo" #'my-link-alias)

(defun a-tester-fnx ()
  (message "Testing!")
  (sit-for 2))
(defalias #'my-alist-alias #'a-tester-fnx)
(add-to-list 'auto-mode-alist '("foo" . my-alist-alias))

λバッファにprettify-symbols-mode表示さlambdaれるλことを主に検討している場合は、バッファのテキストを変更せずに表示されることを試してみてください。


奇妙なことに、私がlambda直接使用すると、すべてが正常に動作します。
rtrn

@rtrn:ああ、良い点。lambdaマクロがlambda、エイリアスが取得していない自己引用の特殊な形式を返すためだと思いますが、ここにはもっと黒魔術があるかもしれません。@Malabarbaを召喚してください。
ダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.