gpt4 book ai didi

lisp - Common LISP 中的简单 CouchDB 获取和显示记录

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:01 26 4
gpt4 key购买 nike

我正在迈出 Common Lisp 的第一步感谢 clouchdb http://common-lisp.net/project/clouchdb/#examples

我设法从 couchdb 中获取了一些简单的数据

      (invoke-view "hulk" "hulk" )
((:|total_rows| . 2) (:|offset| . 0) (:|rows| ((:|id| . "gjc") (:|key| . "hulk") (:|value|
(:|_id| . "gjc2321o3io13") (:|_rev| . "3-b6433781c65460f2c9b1f1a153953171")
(:NAME . "Dr Bruce Banner") (:|kind| . "users") (:|username| . "hulk") (:|title| . "gamma r adia
tions: what to do ?"))) ((:|id| . "irnmn239223") (:|key| . "ironman") (:|value| (:|_id| . "irnmn2 39223")

(:|_ rev| . "5-2b6cf739d24b1208fe8eca70e37ffdc9") (:|name| . "tony stark") (:|title| .
(:|name| . "tony stark") (:|title| . "why iphone 5 sucks - but i own one \"") (:|kind| . "users") (:|username| . "ironman") (:|text| . "welcome to post number one ......")))))

7>

我正在使用 SEXML 来显示 HTML 记录,所以我的 HTML 显示模板如下所示

 ;;static here 
(<:h2 "((LISP RETRO BLOG))")
(<:h3 "(( ***** RETRO BUT STILL COOL *****))")
(<:p "( (MADE IN LISP ))")
(<:p "READY.")
(<:img :src "/img/prompt.gif" :alt "cursor"))
;;this is a variable
(<:p "universal time: " mytime)

现在我会通过上面提到的结果创建一个简单的循环(例如用户名是 ironman 和 hulk)以显示类似

的内容
  (<:p "Welcome!" username) 

很抱歉为最终可能是一个非常简单的循环发布了这么多代码。我确实阅读并尝试了示例 (http://psg.com/~dlamkins/sl/chapter05.html) 和其他资源,但我可能遗漏了一些非常基本的东西,非常感谢您的帮助。请注意,couchdb 文档可能具有不同的字段,因此它与循环遍历具有模式的某些记录并不完全相同。这可能是相关的,例如如果一个文档是一篇博客文章,它可能包含也可能不包含标签,所以我可能想显示/创建一个包含文档中所有可用数据的页面(可能不包括 _id)。

如果有什么不清楚的地方,请发表评论,我很乐意编辑问题。

提前致谢!

最佳答案

如果重新格式化输出数据以使其更具可读性,您将更好地理解输出数据。像这样:

((:|total_rows| . 2) (:|offset| . 0)
(:|rows|
((:|id| . "gjc") (:|key| . "hulk")
(:|value|
(:|_id| . "gjc2321o3io13")
(:|_rev| . "3-b6433781c65460f2c9b1f1a153953171")
(:NAME . "Dr Bruce Banner")
(:|kind| . "users")
(:|username| . "hulk")
(:|title| . "gamma radiations: what to do ?")))
((:|id| . "irnmn239223") (:|key| . "ironman")
(:|value|
(:|_id| . "irnmn2 39223")
(:|_ rev| . "5-2b6cf739d24b1208fe8eca70e37ffdc9")
(:|name| . "tony stark")
(:|title| .

;; here you repeat name and title, so the previous and next lines are erroneous

(:|name| . "tony stark")
(:|title| . "why iphone 5 sucks - but i own one \"")
(:|kind| . "users")
(:|username| . "ironman")
(:|text| . "welcome to post number one ......")))))

因此,您通过 clouchdb 从 CouhcDB 获得的是一个特殊结构的列表,用 Lisp 的说法称为 alist。有一组用于处理列表的函数,其中最重要的是 ASSOC

结果告诉您,您有 2 行,每一行都将数据作为另一个列表保存。要迭代它们,您可以使用以下函数:

(defun maprows (fn data)
(mapcar fn (cdr (assoc :|rows| data))))

现在您必须向MAPROWS 传递一个参数FN 的函数。例如,如果您只想以合理的方式打印值,则可以传递以下函数。

(defun print-row (record)
(dolist (pair (cdr (assoc :|value| record)))
(format t "~A: ~A~%" (car pair) (cdr pair)))
(terpri))

让我们看看它是如何工作的:

CL-USER> (maprows 'print-row
'((:|total_rows| . 2) (:|offset| . 0)
(:|rows|
((:|id| . "gjc") (:|key| . "hulk")
(:|value|
(:|_id| . "gjc2321o3io13")
(:|_rev| . "3-b6433781c65460f2c9b1f1a153953171")
(:NAME . "Dr Bruce Banner")
(:|kind| . "users")
(:|username| . "hulk")
(:|title| . "gamma radiations: what to do ?")))
((:|id| . "irnmn239223") (:|key| . "ironman")
(:|value|
(:|_id| . "irnmn2 39223")
(:|_rev| . "5-2b6cf739d24b1208fe8eca70e37ffdc9")
(:|name| . "tony stark")
(:|title| . "why iphone 5 sucks - but i own one \"")
(:|kind| . "users")
(:|username| . "ironman")
(:|text| . "welcome to post number one ......"))))))
_id: gjc2321o3io13
_rev: 3-b6433781c65460f2c9b1f1a153953171
NAME: Dr Bruce Banner
kind: users
username: hulk
title: gamma radiations: what to do ?

_id: irnmn2 39223
_rev: 5-2b6cf739d24b1208fe8eca70e37ffdc9
name: tony stark
title: why iphone 5 sucks - but i own one "
kind: users
username: ironman
text: welcome to post number one ......

(NIL NIL)

如您所见,MAPROWS 也收集 FN 的应用结果,底层 MAPCAR 也是如此。

关于lisp - Common LISP 中的简单 CouchDB 获取和显示记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683707/

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