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

Ped*_*ino 0 common-lisp type-conversion

我有一个.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"))
Run Code Online (Sandbox Code Playgroud)

我可以阅读它:

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

返回:

" ((: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\")) 
"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

谢谢。

Sva*_*nte 7

问题是日期格式。 @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
Run Code Online (Sandbox Code Playgroud)