pap*_*aga 2 macros metaprogramming common-lisp plist
通用语言服务程序
这是我的问题:我想从 csv 文件读取列标题,并从这些标题创建一个返回 plist 的函数,其中标题是属性名称:
假设我们有一个 csv 文件,其列标题为“名称”、“日期”、“事件”。我想从这 3 个字符串创建一个如下函数:
(defun read-csv-line (x y z)
(list :Name x :Date y :Event z))
Run Code Online (Sandbox Code Playgroud)
这样我就可以继续阅读以下几行:
(read-csv-line "Bob" "1/1/1985" "Birthday")
Run Code Online (Sandbox Code Playgroud)
我认为宏可以解决这个问题:
(defmacro convert-to-plist (x y z)
`(defun read-csv-line (a b c)
(list :,(intern x) a :,(intern y) b :,(intern z) c)))
Run Code Online (Sandbox Code Playgroud)
但这种语法不被认为是正确的。
那你说我怎么能做到呢?当然,如果参数数量可变的话会更好......
提前致谢!你的,h
像这样的事情怎么样:
CL-USER 34 > (defun make-headers (strings &aux (package "KEYWORD"))
(mapcar (lambda (name)
(intern (string-upcase name) package))
strings))
MAKE-HEADERS
CL-USER 35 > (defparameter *headers* (make-headers '("Name" "Date" "Event")))
*HEADERS*
CL-USER 36 > (defun read-csv-line (&key (headers *headers*) line)
(pairlis headers line))
READ-CSV-LINE
CL-USER 37 > (read-csv-line :line (list "Bob" "1/1/1985" "Birthday"))
((:EVENT . "Birthday") (:DATE . "1/1/1985") (:NAME . "Bob"))
Run Code Online (Sandbox Code Playgroud)