gpt4 book ai didi

common-lisp - LISP 文件 I/O - 提取和转换信息

转载 作者:行者123 更新时间:2023-12-01 05:14:52 24 4
gpt4 key购买 nike

我有一个看起来基本上像这样的文件(furniture.lisp)(还有更多条目):

(addgv :furniture 'stove
(make-instance 'stove
:pose (tf:make-pose-stamped
"map" ; frame-id
0.0
(tf:make-3d-vector -3.1 -0.9 0) ; translation/origin
(tf:euler->quaternion :az 0))))

(addgv :furniture 'drawers-cupboard
(make-instance 'cupboard
:pose (tf:make-pose-stamped
"map"
0.0
(tf:make-3d-vector -3.1 0.1 0)
(tf:euler->quaternion :az 0))))

现在,我想要一个函数 (get-locations "furniture.lisp" "locations.txt")提取 3d 向量中的对象坐标并将其输出写入文件:
(location stove -3.1 -0.9 9)
(location drawers-cupboard -3.1 0.1 0)
...

我首先编写了一个表达式,它逐行读取文件(到目前为止还没有参数化):
(ql:quickload "split-sequence")

(with-open-file (stream "furniture.lisp")
(do ((line (read-line stream nil)
(read-line stream nil)))
((null line))
(princ (split-sequence::split-sequence #\Space line)) ; Just for demonstration
))

但我意识到我没有机会/想法“连接”对象的名称(例如炉子)及其坐标。我需要“(addgv”之后的第二个符号作为名称,变量“单词距离”作为坐标。所以我尝试将文件读入一个大列表:
(defun make-list-from-text (fn)
(with-open-file (stream fn)
(loop for line = (read-line stream nil nil)
while line
collect
(split-sequence::split-sequence #\Space line))))

因此每一行都是一个子列表(我不知道这个子结构是否是一个优势,也许我应该“扁平化”结果)。现在我被困住了。此外,我有一种感觉,我的方法有点不雅。

编辑:

我按照 Svante 的方法,终于得到了想要的输出!除了创建一个虚拟包之外,我还必须为该包创建虚拟导出(例如 :export :make-3d-vector )。此外, :key #'car不起作用,因为我的列表是一个“混合”列表,由子列表(例如 (make-instance ...) )和符号(例如 addgv )组成。所以我创建了一个辅助函数:
(defun find-helper (list-or-symbol)
(if (listp list-or-symbol)
(car list-or-symbol)
list-or-symbol))

并替换为 #'car通过 #'find-helper .

最佳答案

我的想法是创建一个虚拟 tf包,然后 read表格并解析您需要的任何内容。像这样的东西(未经测试):

(eval-when (:compile-toplevel :load-toplevel :execute)
(unless (find-package #:tf)
(defpackage #:tf)))

(defun extract-location-file ()
(let ((*read-eval* nil))
(with-open-file (in "furniture.lisp")
(with-open-file (out "locations.txt"
:direction :output
:if-exists :supersede
:if-does-not-exist :create)
(loop :for form := (read in nil)
:while form
:do (print (extract-location form) out)
(terpri)))))

(defun extract-location (form)
`(location ,(third form)
,@(rest (find 'tf::make-3d-vector
(find 'tf::make-pose-stamped
(find 'make-instance
form
:key #'car)
:key #'car)
:key #'car))))

一定不要忽略绑定(bind) *read-eval*nil .

关于common-lisp - LISP 文件 I/O - 提取和转换信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21619484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com