什么时候变量在骨架函数中正确输出?

时间:2014-08-26 13:45:01

标签: emacs elisp

我试图编写一个骨架函数来在循环中输出表达式。我可以做一个循环,

(define-skeleton test
    ""
    > "a")

当我评估这个功能时,它会输出" a"根据需要进入工作缓冲区。但是,我在插入循环时遇到问题。我现在有,

(define-skeleton test
  "A test skeleton"
  (let ((i 1))
  (while (< i 5)
   >"a"
   (setq i (1+ i)))))

我希望这能输出&#34; aaaaa&#34;。但是,在这种情况下,没有任何东西输出到工作缓冲区。插入循环时会发生什么?

2 个答案:

答案 0 :(得分:1)

> somestring骨架dsl在lisp表单中不起作用。 但是,您可以在循环内连接字符串:

(define-skeleton barbaz
    ""
  ""
  (let ((s ""))
    (dotimes (i 5)
      (setq s (concat s "a")))
    s)
  )

我的理解是代码如 > "a"

仅适用于骨架内的第一个嵌套级别。

[编辑] 关于您的问题

  

插入循环时发生了什么?

插入let表单的返回值(即while表单的返回值)。我不知道为什么在评估> "a"时不会引发错误,但while表单的返回值为nil,因此不会插入任何内容。

答案 1 :(得分:0)

我确实同意,如果您需要在骨架中使用define-skeleton函数,那么使用(insert并没有多大意义。 这也是使用define-skeleton的相当简单的示例。

也就是说,它们通常比defun更易于阅读,并且在您要创建插入文本的功能(并且可以选择接受输入)时非常有用。

例如,您可能希望让其他字符重复设置编号。的时间...下面,str指的是函数提供的参数(通常是 str ing),而v1v2是该函数的默认名称。 skeleton中的局部变量。因此:

(define-skeleton s2 ""
  nil ; don't prompt for value of 'str'
  '(set 'v1 (make-string 5 (string-to-char str)))
  \n v1 \n \n)

下面,调用该函数会导致换行符(字符串),然后将光标留在方括号[]所指示的位置。

(s2 "a")
aaaaa
[]