首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免破坏-绑定ARG-计数错误?

如何避免破坏-绑定ARG-计数错误?
EN

Stack Overflow用户
提问于 2016-12-15 04:40:11
回答 3查看 247关注 0票数 3

我需要从数据库中读取一个通用Lisp对象的字符串。对象应该是一个包含两个双浮动元素的列表;“(1.0d02.0d0)”,例如:

代码语言:javascript
运行
复制
(let* ((str "(1d0 2d0)")
       (off (read-from-string str)))
  (destructuring-bind (x y)
      off (list x y)))

但是,是否存在字符串格式不正确的情况?例如,查询失败,或者对象不存在。代码将给出arg计数错误:

代码语言:javascript
运行
复制
error while parsing arguments to DESTRUCTURING-BIND:
  too few elements in
    ()
  to satisfy lambda list
    (X Y):
  exactly 2 expected, but got 0
   [Condition of type SB-KERNEL::ARG-COUNT-ERROR]

我必须使用以下代码来进行类型检查。

代码语言:javascript
运行
复制
(let* ((str "(1d0 2d0)")
       (off (read-from-string str)))
  (destructuring-bind (x y)
      (if (and off
               (typep off 'list)
               (= 2 (length off)))
          off
          (list 0d0 0d0)) (list x y)))

如果str没有正确格式化,代码段将返回默认值。:(0.0d0.0d0)

我做得对吗?有更好的方法来避免这个错误吗?

EN

Stack Overflow用户

发布于 2016-12-15 12:20:35

请注意,有许多可能的错误来源。例如,读者可以检测错误。

确保处理错误:

代码语言:javascript
运行
复制
(defun get-it (s)
  (let ((*read-eval* nil))      ; don't execute code on reading!
    (flet ((check (it)
             (if (and (listp it)
                      (= (length it) 2)
                      (every #'double-float-p it))
                 it
               (error "data is not a list of two double-floats: ~a" it))))
             (handler-case (check (read-from-string s))
               (error (condition)
                 (princ condition)
                 (list 0.0d0 0.0d0))))))


CL-USER 34 > (get-it "(0.0d0 0.0d0)")
(0.0D0 0.0D0)

CL-USER 35 > (get-it "(0.0d0 0.0d0")
End of file while reading stream #<SYSTEM::STRING-INPUT-STREAM 40E06AD7DB>.
(0.0D0 0.0D0)

CL-USER 36 > (get-it "(0.0d0 foo:aa))")
Reader cannot find package FOO.
(0.0D0 0.0D0)

CL-USER 37 > (get-it ")")
Unmatched right parenthesis.
(0.0D0 0.0D0)

CL-USER 38 > (get-it "(1 2 3)")
data not a list of two double-floats: (1 2 3)
(0.0D0 0.0D0)
票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41156543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档