lisp - 如何告诉 lisp 阅读器函数在解析过程中忽略错误

标签 lisp common-lisp token

我需要一种方法来抑制在使用 read-from-string 解析代码时引发的任何错误消息,以便我可以使用类似这样的方法从 Clojure 代码中读取:

(let* ((string-with-code "  '(func UpperCase \"string\")")
       (brace-pos (position #\( string-with-code))
       (end-of-token (+ brace-pos 
                        (position #\Space (subseq string-with-code brace-pos))))
       (first-token (subseq string-with-code (incf brace-pos) end-of-token)))
  (format t "Found function: '~a'" 
          (read-from-string first-token)))
  ;; ==> Found function: 'func'

它基本上从字符串中的 lisp 代码打印函数名称。它工作正常,直到您尝试使用点运算符 (.) 作为列表中的第一项。 Clojure 使用 .cons 并访问 Java 包中的类,因此有效代码如下:

(defmacro chain
  ([x form] `(. ~x ~form))
  ([x form & more] `(chain (. ~x ~form) ~@more)))

会导致错误:

*** - READ from #<INPUT STRING-INPUT-STREAM>: token "." not allowed here

如果我要遍历它打印代码中的每个函数。我想要一种方法来忽略/抑制来自 read-from-string 的错误消息,以便此代码在不修改 lisp 阅读器工作方式的情况下更好地工作。

编辑:

一个完整的程序:

(defvar string-with-code "(defmacro chain
                    ([x form] `(d ~x ~form))
                    ([x form & more] `(chain (. ~x ~form) ~@more)))
    ")

(defvar end-of-token 0)
(defvar first-token 0)

(defun functions-in-string (code)
  (let ((bpos (position #\( code)))
    (unless (null bpos) 
      (setq end-of-token (+ bpos (position #\Space (subseq code bpos))))
      (setq first-token (subseq code (incf bpos) end-of-token))
      (ignore-errors
       (format t "Found function: '~(~A~)'~%" (read-from-string first-token)))
      (functions-in-string (subseq code end-of-token)))))

    ;; (ignore-errors
     ;; (functions-in-string 0 code))

(functions-in-string string-with-code)

输出:

Found function: 'defmacro'
Found function: '[x'
Found function: 'd'
Found function: '[x'
Found function: 'chain'
;; You'll get the error below if ignore-errors wraps around the function call
;; *** - READ from #<INPUT STRING-INPUT-STREAM>: token "." not allowed here

最佳答案

不清楚你在问什么,但忽略错误只是:

CL-USER 37 > (ignore-errors (read-from-string "(. foo bar)"))
NIL
#<CONDITIONS:SIMPLE-READER-ERROR 402000243B>

如果出现错误,IGNORE-ERRORS 返回 NIL 并且作为第二个返回值条件。

如果你想要更多的控制,你需要编写一个错误处理程序。

关于lisp - 如何告诉 lisp 阅读器函数在解析过程中忽略错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20081683/

相关文章:

3 的倍数的 Lisp 总和

lisp - Lisp 中的默认编程

python - token 错误 : EOF in multiline statement in Python. .. 这是什么意思?

java - Lucene TokenFilter 与 EnglishAnalyzer 用于删除科学文章中的数字

lambda - Common Lisp 中的自执行 lambda 表达式

random - 如何在 Common Lisp 中生成 [0 ... 1.0] 中的随机数

macros - Common Lisp 宏中的词法绑定(bind)

lisp - armed bear common lisp 有问题——从 repl 调用用户定义的类?

lisp - Common Lisp - 符号计算的简单介绍 : Excercise 4. 4

java - 如何确保 Scanner hasNextInt() 请求新输入?