【问题标题】:Need to extend elisp function需要扩展elisp函数
【发布时间】:2020-04-22 04:29:57
【问题描述】:

全部,

我必须对 eLisp 感到厌烦。很快就完成了第一个功能。

(defun sort-lines-reverse (beg end)
  "sort lines in reverse order"
   (interactive
   (if (use-region-p)
       (list (region-beginning) (region-end))
     (list (point-min) (point-max))))
   (if (and beg end)
       (sort-lines 1 beg end))
   )

完美运行。用软管冲洗下一个

(defun sort-numeric-fields-reverse (field beg end)
  "sort numeric fields in reverse order"
  (interactive
   (if (use-region-p)
       (list (read-number "Field number: " 1) (region-beginning) (region-end))
     (list (read-number "Field number: " 1) (point-min) (point-max)))
   (message "calling if")
   (if (and beg end)
       ((message "inside if")
        (sort-numeric-fields field beg end)
        (reverse-region beg end))
     )
   ))

没有运行没有命中没有错误。在消息中看不到一条消息。我确实收到了我的字段编号提示。

一个随机生成的测试数据的sn-p,如果你愿意的话。

8       412086510
8       744308263
8       1482781895
8       995992436
1       1021762533
1       897682569
1       963686690
1       166565707
1       2096612583
1       829723388
1       587753131
1       264251710
32      139885828
32      781244288

在我的 KDE Neon 环境中雪上加霜的是,用于调出 lisp 调试器的 C-M-x 不会下蹲。

这两个函数之间唯一真正的区别在于,我必须提示输入字段编号。在 if 我运行 2 个函数而不是一个函数的内部。在让第一个工作之后,第二个应该是小菜一碟。

我们将不胜感激。

【问题讨论】:

  • 您的interactive 表单包含整个函数体。由于这是多种形式,并且只需要/评估一个形式,if 之后的所有内容都将被忽略。这样就获得了参数,然后函数立即返回。

标签: elisp


【解决方案1】:

两个问题:

  • missing ) 在交互结束时,在 (if (use-region-p) ... 之后
  • 缺少 progn in (if (and beg end)... (progn 是多余的,因为 if 已被 when 取代。)

修正版:

(defun sort-numeric-fields-reverse (field beg end)
  "sort numeric fields in reverse order"
  (interactive
   (if (use-region-p)
       (list (read-number "Field number: " 1) (region-beginning) (region-end))
     (list (read-number "Field number: " 1) (point-min) (point-max))))
  (message "calling if")
  (when (and beg end)
    (message "inside if")
    (sort-numeric-fields field beg end)
    (reverse-region beg end)))

编辑:代码已更改:根据@phils 的提示将 if-progn 替换为 when。

提示:使用适当的编辑器可以使键入变得容易,并让您可以控制括号。

【讨论】:

  • 当然你可以用(when foo ...)代替(if foo (progn ...))
  • 我使用的是 Emacs,只是不太关心以任何形式的 lisp 工作是问题所在。谢谢你。希望该网站最终会让我将此标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
相关资源
最近更新 更多