Racket xexpr不适用于小于9的数字

时间:2014-05-13 16:45:11

标签: xml racket

我正在尝试将一些数据保存在XML文件中,并且我使用了Racket库。

我有一些奇怪的行为。当我进入:

> (xexpr->string '(elements () (INTEGER-CONSTANT () 9)))
;=>
"<elements><INTEGER-CONSTANT>&#9;</INTEGER-CONSTANT></elements>"

但是当我将9改为8时,我得到:

> (xexpr->string '(elements () (INTEGER-CONSTANT () 8)))
. . xexpr->string: contract violation
  Not an Xexpr. Expected a string, symbol, valid numeric entity, comment, processing instruction, or list, given 8
Context:
'(elements () (INTEGER-CONSTANT () 8))
  in: the 1st argument of
      (-> xexpr? string?)
  contract from: 
      <collects>/xml/private/xexpr.rkt
  blaming: FILE_PATH
  at: <collects>/xml/private/xexpr.rkt:100.2

为什么会这样? 8和9有什么区别?

1 个答案:

答案 0 :(得分:1)

根据this 8是不允许的,9是。对我而言,它似乎被解释为Unicode字符,因为它以&#为前缀:

(xexpr->string '(elements () (INTEGER-CONSTANT () 9)))
=> "<elements><INTEGER-CONSTANT>&#9;</INTEGER-CONSTANT></elements>"

只需在数字旁边加上引号:

(xexpr->string '(elements () (INTEGER-CONSTANT () "8")))
=>"<elements><INTEGER-CONSTANT>8</INTEGER-CONSTANT></elements>"
(xexpr->string '(elements () (INTEGER-CONSTANT () "9")))
"<elements><INTEGER-CONSTANT>9</INTEGER-CONSTANT></elements>"