为什么我不能将此列表作为字符串转换为CommonLisp中的真实列表?

我有一个.lisp包含以下内容的本地文件:

 ((:DATE @2021-08-04T17:36:57.804411-03:00 :URL
   "https://www.facebook.com/r.php")
  (|:name| "jazoest" |:value| "2985" |:type| "hidden")
  (|:name| "lsd" |:value| "AVpp0Bi0ysk" |:type| "hidden")
    (|:id| "u_0_y_q3" |:name| "custom_gender" |:type| "text")
  (|:id| "referrer" |:name| "referrer" |:type| "hidden")
  (|:id| "asked_to_login" |:name| "asked_to_login" |:value| "0" |:type|
   "hidden")
  (|:id| "use_custom_gender" |:name| "use_custom_gender" |:type| "hidden")
  (|:id| "terms" |:name| "terms" |:value| "on" |:type| "hidden")
  (|:id| "ns" |:name| "ns" |:value| "0" |:type| "hidden")
  (|:id| "ri" |:name| "ri" |:value| "afc4dac1-259a-4006-a979-8ab182d93cce"
   |:type| "hidden")
  (|:id| "action_dialog_shown" |:name| "action_dialog_shown" |:type| "hidden")
  (|:id| "invid" |:name| "invid" |:type| "hidden")
    (|:id| "captcha_response" |:name| "captcha_response" |:type| "hidden"))

我可以阅读它:

(uiop:read-file-string "/home/pedro/miscellaneous/misc/tests-output/input-data.lisp")

返回:

" ((:DATE @2021-08-04T17:36:57.804411-03:00 :URL
   "https://www.facebook.com/r.php")
  (|:name| "jazoest" |:value| "2985" |:type| "hidden")
  (|:name| "lsd" |:value| "AVpp0Bi0ysk" |:type| "hidden")
    (|:id| "u_0_y_q3" |:name| "custom_gender" |:type| "text")
  (|:id| "referrer" |:name| "referrer" |:type| "hidden")
  (|:id| "asked_to_login" |:name| "asked_to_login" |:value| "0" |:type|
   "hidden")
  (|:id| "use_custom_gender" |:name| "use_custom_gender" |:type| "hidden")
  (|:id| "terms" |:name| "terms" |:value| "on" |:type| "hidden")
  (|:id| "ns" |:name| "ns" |:value| "0" |:type| "hidden")
  (|:id| "ri" |:name| "ri" |:value| "afc4dac1-259a-4006-a979-8ab182d93cce"
   |:type| "hidden")
  (|:id| "action_dialog_shown" |:name| "action_dialog_shown" |:type| "hidden")
  (|:id| "invid" |:name| "invid" |:type| "hidden")
    (|:id| "captcha_response" |:name| "captcha_response" |:type| "hidden")) 
"

我尝试使用该函数read-from-string将此列表作为字符串转换为真正的列表。这种方法适用于示例示例,例如:

CL-USER> (read-from-string "((1 2 3) (a b c))")
((1 2 3) (A B C))
17

不幸的是,当我尝试对前面提到的字符串使用相同的方法时,我收到一条错误消息:

CL-USER> (uiop:read-file-string "/home/pedro/miscellaneous/misc/tests-output/input-data.lisp")
CL-USER> (read-from-string *)

“36”中有太多冒号。行:1,列:26,文件位置:26 流:#<SB-IMPL::STRING-INPUT-STREAM {10083FC0E3}> [SB-INT:SIMPLE-READER-ERROR 类型的条件]

为什么会发生这种情况?我该如何解决?

谢谢。

回答

问题是日期格式。 @2021-08-04T17:36:57.804411-03:00不是标准语法中的有效标记。您需要更改为包含@库中读取器宏的可读表local-time

示例交互:

CL-USER> (ql:quickload "local-time")
To load "local-time":
  Load 1 ASDF system:
    local-time
; Loading "local-time"
[package local-time]......................
("local-time")
CL-USER> (local-time:enable-read-macros)
; No value
CL-USER> (read-from-string "@2021-08-04T17:36:57.804411-03:00")
@2021-08-04T22:36:57.804411+02:00
33


以上是为什么我不能将此列表作为字符串转换为CommonLisp中的真实列表?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>