Common lisp 为什么当我使用intern将字符串转换为符号时,结构的accesror函数会返回错误?

Common lisp 为什么当我使用intern将字符串转换为符号时,结构的accesror函数会返回错误?,common-lisp,Common Lisp,根据大多数标准,我是一个lisp程序员新手,但是,我不觉得我要做的事情特别复杂,我不明白为什么它不起作用 我正在尝试创建一个数据库,它记录了一段时间内发生的事件,并根据它们彼此之间的关系进行连接。这个概念是高度实验性的,不是我想要的反馈 其思想是为事件生成一个随机名称(在程序中称为符号,我知道是糟糕的样式),为事件生成随机数量的外观(具有开始时间、持续时间和直到事件再次发生的时间段)。然后,一旦我创建了一个随机数目的事件类型,以及每个事件的随机数的外观,我想按时间顺序将它们组织在一个列表中,但我

根据大多数标准,我是一个lisp程序员新手,但是,我不觉得我要做的事情特别复杂,我不明白为什么它不起作用

我正在尝试创建一个数据库,它记录了一段时间内发生的事件,并根据它们彼此之间的关系进行连接。这个概念是高度实验性的,不是我想要的反馈

其思想是为事件生成一个随机名称(在程序中称为符号,我知道是糟糕的样式),为事件生成随机数量的外观(具有开始时间、持续时间和直到事件再次发生的时间段)。然后,一旦我创建了一个随机数目的事件类型,以及每个事件的随机数的外观,我想按时间顺序将它们组织在一个列表中,但我并没有走多远,因为我创建的名称在sym-aprs-h的sym外观访问器函数中生成了一个类型错误。它试图告诉我它不是预期的sym类型,但当我运行诸如调用on-ran sym name的类型之类的测试时,它返回symbol。所以我真的不知道发生了什么

(defun initialize ()
  (defvar *alphabet* '#(a b c d e f g h i j k l m n o p q r s t u v w x y z))
  (defvar *symbol-names* nil)
  (defvar *moment-chain* nil))

(defun ran-let ()
  (Coerce (aref *alphabet* (random 26)) 'character))

(defun ran-sym-name ()
  (intern (coerce (list (ran-let) (ran-let) (ran-let) (ran-let) (ran-let) (ran-let)) 'string)))

(defstruct sym 
  (name nil)         
  (appearances nil)
  (connections nil))

(defun ran-sym-gen ()
  (let ((x (ran-sym-name)))
    (cond ((member x *Symbol-names*) (ran-sym-gen))                 
      (t (push x *Symbol-names*)(make-sym :name x)(sym-aprs x)))))

(defun sym-aprs-h (s tm n)
 (let ((dr (+ 1 (random 7200))))                                     
  (cond ((=  n 0) nil)                      
     (t (push (list tm dr nil) (sym-appearances s)) (push (list tm dr s nil) *moment-chain*) (sym-aprs-h s (+ tm dr (random 14400)) (- n 1))))))

(defun sym-aprs (s)
  (sym-aprs-h s (get-universal-time) (+ 1 (random 101))))

(defun mchain-org ()
  (sort *moment-chain* #'< :key #'car))

(defun mchain-con (n)
  (cond ((= 0 n) nil)
        (t (ran-sym-gen) (mchain-con (- n 1)))))
(取消初始化()
(defvar*字母表*'#(a b c d e f g h i j k l m n o p q r s t u v w x y z))
(defvar*符号名称*nil)
(defvar*力矩链*nil))
(德芬兰让)
(强制(aref*字母表*(随机26))'字符)
(定义运行符号名称()
(实习生(强制(列表(冉让)(冉让)(冉让)(冉让)(冉让)(冉让)(冉让))字符串)
(defstruct sym
(姓名无)
(无)
(无)
(除运行符号发电机()
(let((x(ran符号名称)))
(cond((成员x*符号名称*)(ran sym gen))
(t(推x*符号名称*)(使符号:名称x)(符号aprs x(()()))
(除sym-aprs-h(南、北)
(让((dr(+1(随机7200)))
(cond(=n0)nil)
(推(列表tm dr nil)(sym s))(推(列表tm dr s nil)*力矩链*)(sym-aprs-h s(+tm dr(随机14400))(-n 1‘‘‘‘‘‘‘‘‘)
(除sym aprs外)
(sym-aprs-HS(获取世界时)(+1(随机101)))
(defun mchain组织)
(分类*力矩链*#'<:钥匙车)
(德芬·麦克哈因监狱(北)
(cond(=0N)零
(t(代表符号根)(麦克哈因监狱(-n1(())))
正如我所说的,我对这门语言还不熟悉,并且通过接受一点超出我能力范围的东西来自学。任何建设性的批评都将受到赞赏,然而,我主要感兴趣的是让sym外观不产生类型错误

(defun initialize ()
  (defvar *alphabet* '#(a b c d e f g h i j k l m n o p q r s t u v w x y z))
  (defvar *symbol-names* nil)
  (defvar *moment-chain* nil))
DEFVAR不属于DEFUN内部。DEFVAR是一个顶级宏

(defun ran-let ()
  (Coerce (aref *alphabet* (random 26)) 'character))
一次又一次地强迫

(defun ran-sym-name ()
  (intern (coerce (list (ran-let) (ran-let) (ran-let) (ran-let) (ran-let) (ran-let))
                  'string)))
只需从字符串中选取字符并附加它们

(defstruct sym 
  (name nil)         
  (appearances nil)
  (connections nil))

(defun ran-sym-gen ()
  (let ((x (ran-sym-name)))
    (cond ((member x *Symbol-names*) (ran-sym-gen))                 
          (t (push x *Symbol-names*)
             (make-sym :name x)
             (sym-aprs x)))))
(make sym:name x)
的结果在Lisp nirvana中消失。您将符号传递给
sym aprs
这真的是您想要的吗

(defun sym-aprs-h (s tm n)
 (let ((dr (+ 1 (random 7200))))                                     
  (cond ((=  n 0) nil)                      
     (t (push (list tm dr nil) (sym-appearances s))
        (push (list tm dr s nil) *moment-chain*)
        (sym-aprs-h s (+ tm dr (random 14400)) (- n 1))))))

(defun sym-aprs (s)
  (sym-aprs-h s (get-universal-time) (+ 1 (random 101))))

(defun mchain-org ()
  (sort *moment-chain* #'< :key #'car))

(defun mchain-con (n)
  (cond ((= 0 n) nil)
        (t (ran-sym-gen) (mchain-con (- n 1)))))
(定义sym-aprs-h(s tm n)
(让((dr(+1(随机7200)))
(cond(=n0)nil)
(推送(列表tm dr nil)(符号s)
(推力(列表tm dr s无)*力矩链*)
(sym-aprs-HS(+tm dr(随机14400))(-n 1()()()))
(除sym aprs外)
(sym-aprs-HS(获取世界时)(+1(随机101)))
(defun mchain组织)
(分类*力矩链*#'<:钥匙车)
(德芬·麦克哈因监狱(北)
(cond(=0N)零
(t(代表符号根)(麦克哈因监狱(-n1(())))
为什么不使用DOTIMES或LOOP

样式:您可能需要检查
s
和其他变量的类型。使用会说话的名字和/或文档也可能有用

如果你在一周内查看代码,你将无法知道它应该做什么

您还希望以不同的格式设置代码。看我的版本

DEFVAR不属于DEFUN内部。DEFVAR是一个顶级宏

(defun ran-let ()
  (Coerce (aref *alphabet* (random 26)) 'character))
一次又一次地强迫

(defun ran-sym-name ()
  (intern (coerce (list (ran-let) (ran-let) (ran-let) (ran-let) (ran-let) (ran-let))
                  'string)))
只需从字符串中选取字符并附加它们

(defstruct sym 
  (name nil)         
  (appearances nil)
  (connections nil))

(defun ran-sym-gen ()
  (let ((x (ran-sym-name)))
    (cond ((member x *Symbol-names*) (ran-sym-gen))                 
          (t (push x *Symbol-names*)
             (make-sym :name x)
             (sym-aprs x)))))
(make sym:name x)
的结果在Lisp nirvana中消失。您将符号传递给
sym aprs
这真的是您想要的吗

(defun sym-aprs-h (s tm n)
 (let ((dr (+ 1 (random 7200))))                                     
  (cond ((=  n 0) nil)                      
     (t (push (list tm dr nil) (sym-appearances s))
        (push (list tm dr s nil) *moment-chain*)
        (sym-aprs-h s (+ tm dr (random 14400)) (- n 1))))))

(defun sym-aprs (s)
  (sym-aprs-h s (get-universal-time) (+ 1 (random 101))))

(defun mchain-org ()
  (sort *moment-chain* #'< :key #'car))

(defun mchain-con (n)
  (cond ((= 0 n) nil)
        (t (ran-sym-gen) (mchain-con (- n 1)))))
(定义sym-aprs-h(s tm n)
(让((dr(+1(随机7200)))
(cond(=n0)nil)
(推送(列表tm dr nil)(符号s)
(推力(列表tm dr s无)*力矩链*)
(sym-aprs-HS(+tm dr(随机14400))(-n 1()()()))
(除sym aprs外)
(sym-aprs-HS(获取世界时)(+1(随机101)))
(defun mchain组织)
(分类*力矩链*#'<:钥匙车)
(德芬·麦克哈因监狱(北)
(cond(=0N)零
(t(代表符号根)(麦克哈因监狱(-n1(())))
为什么不使用DOTIMES或LOOP

样式:您可能需要检查
s
和其他变量的类型。使用会说话的名字和/或文档也可能有用

如果你在一周内查看代码,你将无法知道它应该做什么

您还希望以不同的格式设置代码。请参阅我的版本。

关于
(defun ran let()(强制(aref*alphabet*(random 26))“字符”)
,为什么不把*alphabet*做成一个字符串,这样就可以从中提取字符?“但我没有走多远,因为我正在创建的名称在sym-aprs-h中的sym外观访问器函数中生成了一个类型错误。它试图告诉我它不是预期的sym类型,但当我运行诸如调用on-ran sym name的类型之类的测试时,它返回symbol。所以我真的不知道发生了什么。“stacktrace是什么样子的?请显示错误。关于
(defun ran let()(强制(aref*alphabet*(random 26))'字符))
,为什么不把*alphabet*做成一个字符串,这样就可以从中提取字符?”但是我没有走多远,因为我正在创建的名称在sym-aprs-h中生成了一个类型错误,在sy中