gpt4 book ai didi

database - 从 FORMAT 输出到字符串?

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:18 24 4
gpt4 key购买 nike

就在最近,我一直在玩弄 lisp,我正在尝试创建一个通用的本地数据库,我正在学习另一个教程,该教程涵盖了大部分此类项目,但是我决定要添加一个“简单”的功能。

我正在尝试以自定义格式生成时间戳,并将它们保存到字符串中。我试图通过调用 format 并将变量作为第一个参数,将 format 生成的字符串存储到用 defvar 声明的变量中,但是我没有保存完整的输出,而是只得到了一个月中的某一天。这是我的代码:

(defun date ()

(setq *SUPPRESS-SIMILAR-CONSTANT-REDEFINITION-WARNING* 1)
(defconstant *day-names*
'("Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday"))
*DAY-NAMES*

(multiple-value-bind
(second minute hour date month year day-of-week dst-p tz)
(get-decoded-time)
(defvar datetime)
(format datetime "~2,'0d:~2,'0d:~2,'0d ~a ~d/~2,'0d/~d (GMT~@d)"
hour
minute
second
(nth day-of-week *day-names*)
month
date
year
(- tz)
(return-from date datetime))))

(defun make-entry (category subject idea info researched)
(defvar date (date))
(list :category category :subject subject :date date :idea idea :info info :researched researched))

ma​​ke-entrydate 的预期值应类似于 21:28:18 Wednesday 7/30/2014 (GMT-7),但我最终只有 30 个,而不是其余部分。我还测试了返回的 30 的类型,它确实是一个整数,而不是它应该是的 char-stream(string)。因此,我确信这与“~d”的格式有关,但我可能错了。真的,我只是想将系统时间的格式化版本传递给 make-entry。

最佳答案

那好吧。 [戴上代码审查帽]


首先,让缩进更加一致。您在缩进方面确实比典型的 lisp 新手做得好得多,但将大部分内容冲到了一栏中。缩进级别可以给你很多关于程序控制流的提示。一旦你习惯了,我的意思是。

(defun date ()

(setq *SUPPRESS-SIMILAR-CONSTANT-REDEFINITION-WARNING* 1)
(defconstant *day-names*
'("Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday"))
*DAY-NAMES*

(multiple-value-bind
(second minute hour date month year day-of-week dst-p tz)
(get-decoded-time)
(defvar datetime)
(format datetime "~2,'0d:~2,'0d:~2,'0d ~a ~d/~2,'0d/~d (GMT~@d)"
hour minute second
(nth day-of-week *day-names*)
month date year
(- tz)
(return-from date datetime))))

(defun make-entry (category subject idea info researched)
(defvar date (date))
(list :category category :subject subject :date date :idea idea :info info :researched researched))

可以但不应该使用 defconstantdefvar本地。要么制作这些顶级表格,要么使用 let 制作它们的本地定义。 .在你的例子中,constant作为全局有意义,而 var可能应该是一个局部变量(但稍后会详细介绍)。此外,既然您没有在每次函数调用时重新定义常量,您就不需要压制重新定义警告。

(defconstant *day-names* '("Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday"))

(defun date ()
*DAY-NAMES*

(multiple-value-bind
(second minute hour date month year day-of-week dst-p tz)
(get-decoded-time)
(let ((datetime))
(format datetime "~2,'0d:~2,'0d:~2,'0d ~a ~d/~2,'0d/~d (GMT~@d)"
hour minute second
(nth day-of-week *day-names*)
month date year
(- tz)
(return-from date datetime)))))

Lisp 形式自动返回它计算的最后一个值,但任何早期的形式只会产生副作用而不是值。具体*DAY-NAMES*date 的开头什么都不做.此外,由于您似乎试图返回 datetime来自 date , 你不需要打电话 return-from .相反,只需评估 datetime .

(defun date ()
(multiple-value-bind
(second minute hour date month year day-of-week dst-p tz)
(get-decoded-time)
(let ((datetime))
(format datetime "~2,'0d:~2,'0d:~2,'0d ~a ~d/~2,'0d/~d (GMT~@d)"
hour minute second
(nth day-of-week *day-names*)
month date year
(- tz))
datetime)))

format将流作为第一个参数。并且变量不是流(尽管它可能包含一个;你的没有)。你似乎想在这里做的是将当前时间作为字符串返回,根据你的 format 格式化。指令。为此,您根本不需要中间值。只需通过 NIL作为 format 的第一个参数, 它会自动用你的内容创建一个新的字符串,并返回它。

(defun date ()
(multiple-value-bind
(second minute hour date month year day-of-week dst-p tz)
(get-decoded-time)
(format nil "~2,'0d:~2,'0d:~2,'0d ~a ~d/~2,'0d/~d (GMT~@d)"
hour minute second
(nth day-of-week *day-names*)
month date year
(- tz))))

此时,date似乎在做一些有意义的事情。

cl-user> (date)
"15:39:12 Thursday 7/31/2014 (GMT-5)"
cl-user>

因为您只是想将一些值放入列表中,所以您也不需要创建局部变量来保存 (date) 的结果。在 make-entry .

(defun make-entry (category subject idea info researched)
(list :category category :subject subject :date (date) :idea idea :info info :researched researched))

此时,make-entry返回 plist谁的:DATE值是来自 date 的适当格式化字符串.

cl-user> (make-entry "something" "something else" "blah" "bleeh" "stop using side effects")
(:CATEGORY "something" :SUBJECT "something else" :DATE
"15:41:57 Thursday 7/31/2014 (GMT-5)" :IDEA "blah" :INFO "bleeh" :RESEARCHED
"stop using side effects")
cl-user>

(defconstant *day-names* '("Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday"))

(defun date ()
(multiple-value-bind
(second minute hour date month year day-of-week dst-p tz)
(get-decoded-time)
(format nil "~2,'0d:~2,'0d:~2,'0d ~a ~d/~2,'0d/~d (GMT~@d)"
hour minute second
(nth day-of-week *day-names*)
month date year
(- tz))))

(defun make-entry (category subject idea info researched)
(list :category category :subject subject :date (date) :idea idea :info info :researched researched))

如果您关注 the PCL database chapter , 请记住,当您读入数据库时​​,您以这种方式格式化的日期将需要再次解码,假设您打算做除字符串比较以外的任何事情。因此,根据您的具体用例,存储 (get-universal-time) 的原始输出实际上可能更有意义。 .

关于database - 从 FORMAT 输出到字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25066800/

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