如何在Common Lisp中的另一个函数内调用一个函数?

问题描述

我最近开始学习Common Lisp,并且发现我真的不知道如何在另一个函数调用用户定义的函数

我发现有时(funcall#'func ...)有效,有时(funcall func ...),具体取决于 func 作为参数传递给调用函数或在 labels 等内部定义。

那为什么要这样区分呢?以及何时使用#'以及何时不使用的通用规则吗?

一个示例是我编写的以下简短代码。请注意, get-next-token reader-fun 函数调用有所不同:

(defvar *end-of-file* (gensym "eof"))

(defun get-reader (reader-type)
  (case reader-type (:char-reader #'read-char)
                    (:line-reader #'read-line)
                    (:exp-reader  #'read)
                    (t (error "UnkNown reader-type argument"))))

(defun read-all (filename reader-type)
  (let ((result '())
        (token  ""))
    (labels ((get-next-token (reader-fun stream)
               (funcall reader-fun stream nil *end-of-file*))
             (read-loop (reader-fun)
               (with-open-file (stream filename :direction :input)
                 (loop      
                   (setq token (funcall #'get-next-token
                                       reader-fun stream))
                   (if (eq token *end-of-file*)
                       (return (nreverse result))
                       (push token result))))))
        (read-loop (get-reader reader-type)))))

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)