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

Why I cannot convert this list as a string to be a real list in Common Lisp?

我有一个包含以下内容的本地 .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")

哪个returns:

" ((: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 *)

too many colons in "36". Line: 1, Column: 26, File-Position: 26 Stream: #<SB-IMPL::STRING-INPUT-STREAM {10083FC0E3}> [Condition of type SB-INT:SIMPLE-READER-ERROR]

为什么会这样?我该如何解决?

谢谢。

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

中的 @ reader 宏的可读表

互动示例:

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