我试图编写一个骨架函数来在循环中输出表达式。我可以做一个循环,
(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;。但是,在这种情况下,没有任何东西输出到工作缓冲区。插入循环时会发生什么?
答案 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),而v1
,v2
是该函数的默认名称。 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
[]