我有许多方便的功能,可以在当前单词或区域上操作,并且由于懒惰等原因。我已经用模板构建了它们......
例如
(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 点或区域的东西,但又不想到处复制它,(因为这很愚蠢,而且维护起来很头疼。)
所以我真正想知道的是,我可以在 Emacs Lisp 中柯里化函数吗?
当我尝试这个时...
(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
我是否愚蠢地假设 Emacs Lisp 中可以进行柯里化!?还是我只是做错了?
我想补充一点,在 Emacs lisp 中柯里化是不可能的——函数应用程序不是柯里化,因为它不遵循柯里化公式。
柯里化意味着将一个函数应用于部分参数,并返回另一个函数。由于动态作用域,这在 Elisp 中是不可能的。
编辑:更新
现在 emacs-gnu 已经关闭了。
首先,emacs-lisp 有点像 2-lisp,所以以下内容无效:
(defun foo (fn)
(fn 3)) ;; DOES NOT WORK!
相反,您必须执行以下操作:
(defun foo (fn)
(funcall fn 3))
因此,如果您将
(setq meat (fn
替换为 (setq meat (funcall fn
,代码应该可以工作。