【发布时间】:2019-05-10 14:58:29
【问题描述】:
我有一个以
(defparameter *myfile*
'(((KEY 1) (A1 CAN) (A2 4)
(SUR (((BCZ S) (FEATS NIL)) (DIR FS) (LADOM ALL)
(((NNEW S) (FEATS NIL)) (DIR BS) (LADOM ALL)
((NNEW NP) (FEATS ((BIG NOM)))))))
(SEM (LAM P (P "CAN"))) (PARAM 1.0))
((KEY 2) (A1 KEDIYI) (A2 4).......开头的文件。
我猜这是一个 CLOS,但它存储在一个文件中。我需要能够在关联列表中获取这些数据以到达 A1 或 A2 等作为键,然后再获取它们的值。我现在做的是逐行读取文件并对其进行字符串操作。但我认为这确实是一种不好的做法。这是我现在的代码;
(defun open_ded (path)
(defvar last_id 0)
(let ((in (open path :if-does-not-exist nil)))
(when in
(loop for line = (read-line in nil)
while line
do
(if (setq key_id (findkeyid line)) ;search "KEY" and return its id value
(setq last_id key_id)) ;if it is not nil, set it to last_id
而且我知道我可以使用 (defparameter *s* (open "path")) 获取整个文件,但是当我想做 (assoc 'A1 (read *s*)) 或 (assoc 'KEY (阅读 *s*)) 它让我无处可去。您对如何实现这一目标有任何想法吗?
【问题讨论】:
-
文件中到底有什么?
defparameter表单或以(((KEY 1) …开头的表单? -
@Svante 是的,它从 defparameter 部分开始,就像您一起定义一个 defparameter 但它在文件中。
标签: common-lisp file-read clos