好的,所以我假设您在 Emacs 缓冲区中打开了一个文件中的输入。
(defun insert-quiz (a-buffer)
(交互式“bBuffer 名称:”)
(let* ((question-pairs (split-string (with-current-buffer a-buffer (buffer-string)))))
(测验答案 (mapcar (lambda (x) (cadr (split-string x "|"))) question-pairs))
(插入
(应用#'concat
(地图车
(λ (x)
(let ((q-pair (split-string x "|")))
(make-question (car q-pair) (answers-list quiz-answers (cadr q-pair)))))
问题对)))))
insert-quiz 是一个交互式函数,它接受一个缓冲区名称,并使用该缓冲区中的内容为您生成一个测验,然后在该点插入该测验作为副作用。它调用了一些较小的函数,我将在下面解释。
(defun make-question(问题答案)
(应用#'格式
"%-16s[ ] %-16s[ ] %-16s[ ] %-16s[ ] %s \n"
(附加
(列表(连接问题“?”))
答案)))
make-question 接受一个问题和一个答案列表,并将它们格式化为测验的一行。
(defun answers-list (quiz-answers right-answer)
(替换(n-wrong-answers quiz-answers 正确答案)
(列出正确答案)
:start1 (随机 3)))
answers-list 列出测验中所有可能的答案和正确答案,并使用 n-wrong-answers 创建一个包含四个答案的列表,其中一个是正确答案。
(defun n-wrong-answers (answer-list right-answer & optional answers)
(如果(= 4(列表长度答案))
答案
(n个错误答案
答案列表
正确答案
(add-to-list 'answers (random-wrong-answer answer-list right-answer)))))
n-wrong-answers 获取测验中所有可能答案的列表和正确答案,然后使用 random-wrong-answer 返回四个唯一不正确答案的列表。
(defun random-wrong-answer (answer-list right-answer)
(let ((gen-answer (nth (random (list-length answer-list)) answer-list)))
(if (and gen-answer (not (string= gen-answer right-answer)))
基因答案
(随机错误答案答案列表正确答案))))
最后,在最低级别,random-wrong-answer 获取测验中所有可能答案的列表,并返回一个错误答案。
将上述函数加载到 Emacs 中后,使用 M-x insert-quiz 并键入您输入的缓冲区的名称(您将获得制表符完成)。更改 insert-quiz 函数以使其采用文件名而不是打开的缓冲区名并不难。
您在上面列出的输入将产生:
阿马里洛? [ ] 黄色 [ ] 橙色 [ ] 灰色 [ ] 红色
蔚蓝? [ ] 金色 [ ] 紫色 [ ] 蓝色 [ ] 橙色
布兰科? [ ] 粉色 [ ] 红色 [ ] 白色 [ ] 黑色
多拉多? [ ] 黄色 [ ] 金色 [ ] 红色 [ ] 橙色
格里斯? [ ] 红色 [ ] 粉红色 [ ] 灰色 [ ] 绿色
马龙? [ ] 棕色 [ ] 黄色 [ ] 白色 [ ] 金色
纳兰贾? [ ] 橙色 [ ] 金色 [ ] 黑色 [ ] 金色
黑人? [ ] 粉色 [ ] 黑色 [ ] 蓝色 [ ] 白色
奥罗? [ ] 红色 [ ] 金色 [ ] 紫色 [ ] 棕色
紫癜? [ ] 紫色 [ ] 橙色 [ ] 灰色 [ ] 黑色
罗霍? [ ] 灰色 [ ] 红色 [ ] 黑色 [ ] 粉红色
罗莎? [ ] 红色 [ ] 绿色 [ ] 粉红色 [ ] 黄色
佛得角? [ ] 绿色 [ ] 紫色 [ ] 红色 [ ] 棕色
希望对您有所帮助。