7

私は現在の単語や地域を操作する便利な機能をたくさん持っています、そして怠惰などのために。私はそれらをテンプレートから構築しました...

例えば

(defun lower-camelcase-at-point-or-region ()
  "lowerCamelCaseTheCurrent dashed or snake_case word or any words in text selection."
  (interactive)
  (let (pos1 pos2 meat)
    (if (and transient-mark-mode mark-active)
        (setq pos1 (region-beginning)
              pos2 (region-end))
      (setq pos1 (car (bounds-of-thing-at-point 'symbol))
            pos2 (cdr (bounds-of-thing-at-point 'symbol))))
    (setq meat (s-lower-camel-case (buffer-substring-no-properties pos1 pos2)))
    (delete-region pos1 pos2)
    (insert  meat)    
    )
  )

事実上、これはこのラインを除いてすべてのボイラープレートです...

(setq meat (s-lower-camel-case (buffer-substring-no-properties pos1 pos2)))

s-lower-camel-caseバッファサブストリングを呼び出す場所。atポイントまたはリージョンのものを再利用したいのですが、どこにでも複製することはありません(それは愚かであり、維持するのが面倒だからです)。

だから私が本当に知りたいのは、EmacsLispで関数をカレーできるかということです。

私がこれを試したとき...

(defun do-stuff-on-point-or-region ()
  "Do stuff."
  (interactive)
  (operate-on-point-or-region 's-lower-camel-case)
)

operate-on-point-or-regionとして定義されている... :

(defun operate-on-point-or-region (fn)
  "Pick the substring at point, or region 
   and replace it with the output of fn"
  (let (pos1 pos2 meat)
    (if (and transient-mark-mode mark-active)
        (setq pos1 (region-beginning)
              pos2 (region-end))
      (setq pos1 (car (bounds-of-thing-at-point 'symbol))
            pos2 (cdr (bounds-of-thing-at-point 'symbol))))
    (setq meat (fn (buffer-substring-no-properties pos1 pos2)))
    (delete-region pos1 pos2)
    (insert  meat)    
    )
)

私は得る:Symbol's function definition is void: fn

私は愚かなことにEmacsLispでカリー化が可能だと思っていますか?それとも私はそれを間違っているだけですか?

4

2 に答える 2

8

Emacsではlispカリー化は不可能です。関数適用はカリー化の公式に従わないため、カリー化されていません。

カリー化とは、関数を部分引数に適用し、別の関数を返すことを意味します。Elispでは、動的スコープのため、これは不可能です。

編集:更新

現在、emacs-gnuにはクロージャがあります。

于 2013-01-30T08:47:38.370 に答える
5

まず、emacs-lispは、ちょっと、sorta、2-lispなので、以下は無効です。

(defun foo (fn)
  (fn 3)) ;; DOES NOT WORK!

代わりに、次のことを行う必要があります。

(defun foo (fn)
  (funcall fn 3))

したがって、コードに置き換える(setq meat (fn(setq meat (funcall fn機能するはずです。

于 2013-01-30T08:12:48.370 に答える