更改LISP中顶级函数的parse integer的默认值:垃圾允许值

更改LISP中顶级函数的parse integer的默认值:垃圾允许值,lisp,common-lisp,keyword,Lisp,Common Lisp,Keyword,我使用LISP在emacs中工作,遇到了一个错误,我不知道如何解决。我将展示输出、我从中了解到的内容以及我缺少的内容 错误: junk in string "(-5 -4 -3 -2 -1 0 1 2 3 4 5 6)" [Condition of type SB-INT:SIMPLE-PARSE-ERROR] Backtrace: 0: (PARSE-INTEGER "(-5 -4 -3 -2 -1 0 1 2 3 4 5 6)" :START 0 :END NIL :RADIX

我使用LISP在emacs中工作,遇到了一个错误,我不知道如何解决。我将展示输出、我从中了解到的内容以及我缺少的内容

错误:

junk in string "(-5 -4 -3 -2 -1 0 1 2 3 4 5 6)"
   [Condition of type SB-INT:SIMPLE-PARSE-ERROR]


Backtrace:

0: (PARSE-INTEGER "(-5 -4 -3 -2 -1 0 1 2 3 4 5 6)" :START 0 :END NIL :RADIX 10 :JUNK-ALLOWED NIL)    
1: ((:METHOD CLSQL-SYS:READ-SQL-VALUE :AROUND (T T T T)) "(-5 -4 -3 -2 -1 0 1 2 3 4 5 6)" INTEGER #<CLSQL-SQLITE3:SQLITE3-DATABASE C:/Users/sas31/idyom/db/database.sqlite OPEN {1007D61933}> :SQLITE3) [fa..     
2: ((:METHOD CLSQL-SYS::UPDATE-SLOT-FROM-DB-VALUE (CLSQL-SYS:STANDARD-DB-OBJECT T T)) #<unavailable argument> #<unavailable argument> #<unavailable argument>) [fast-method]     
3: (CLSQL-SYS::BUILD-OBJECTS (#<CLSQL-SYS:SELECT-LIST {100592E993}>) #<unavailable argument> #<CLSQL-SQLITE3:SQLITE3-DATABASE C:/Users/sas31/idyom/db/database.sqlite OPEN {1007D61933}> #<unavailable argu..    
4: (CLSQL-SYS::FIND-ALL (IDYOM-DB:MTP-EVENT) :RESULT-TYPES :AUTO :REFRESH NIL :INSTANCES NIL :WHERE #<CLSQL-SYS:SQL-RELATIONAL-EXP (MTP_EVENT.COMPOSITION_ID = 0 AND MTP_EVENT.DATASET_ID = 26)> :FLATP T :..    
5: (CLSQL-SYS::FIND-ALL (IDYOM-DB:MTP-EVENT) :RESULT-TYPES :AUTO :REFRESH NIL :INSTANCES NIL :WHERE #<CLSQL-SYS:SQL-RELATIONAL-EXP (MTP_EVENT.COMPOSITION_ID = 0 AND MTP_EVENT.DATASET_ID = 26)> :FLATP T :..    
6: (CLSQL-SYS:SELECT IDYOM-DB:MTP-EVENT :WHERE #<CLSQL-SYS:SQL-RELATIONAL-EXP (MTP_EVENT.COMPOSITION_ID = 0 AND MTP_EVENT.DATASET_ID = 26)> :FLATP T :RESULT-TYPES NIL :DATABASE #<CLSQL-SQLITE3:SQLITE3-DA..    
7: (CLSQL-SYS::FAULT-JOIN-SLOT #<CLSQL-SYS::STANDARD-DB-CLASS IDYOM-DB:MTP-COMPOSITION> #<IDYOM-DB:MTP-COMPOSITION {10047AAA73}> #<CLSQL-SYS::VIEW-CLASS-EFFECTIVE-SLOT-DEFINITION IDYOM-DB::EVENTS>)    
8: ((:METHOD SB-MOP:SLOT-VALUE-USING-CLASS (CLSQL-SYS::STANDARD-DB-CLASS T T)) #<unavailable argument> #<unavailable argument> #<unavailable argument>) [fast-method]    
9: (IDYOM-DB::GET-EVENT-SEQUENCE 26 0)    
10: (IDYOM-DB:COUNT-EVENTS 26 0)    
11: (MIDI2DB::FIX-BIOI-DUR-DELTAST 26)    
12: (SB-INT:SIMPLE-EVAL-IN-LEXENV (MIDI2DB::FIX-BIOI-DUR-DELTAST 26) #<NULL-LEXENV>)    
13: (EVAL (MIDI2DB::FIX-BIOI-DUR-DELTAST 26))

我不知道从这个函数调用这个解析整数的位置,也不知道如何更改那个关键字的值。此外,数字字符串是经过编码的密钥签名,代表此特定数据集中的所有密钥签名,但当此函数似乎只处理
数据集id
组合id
时,为什么如此重要?谢谢你的帮助

查看回溯,我们可以看到,
parse integer
由通用函数
clsql sys:read sql value
上的方法调用

如果不检查代码,就不清楚
:junk allowed nil
是否只是显示默认值的回溯,或者是否通过该方法主动调用

但是,将该集设置为真值并不会真正帮助您,因为返回值将是
nil
(因为“(”不是数字或空格)。这意味着数据库存在更深层次的问题,可能是由于隐式架构冲突(您说过“我想存储数字”),然后存储一个数字列表,ORM执行了无法恢复的操作)


即使您可以为允许的垃圾邮件指定一个真值,但对于像
(-5-4-3-2-1 0 1 2 3 4 5 6)
这样的输入仍然没有意义。parse integer用于解析字符串中的单个整数,而不是整数列表。它似乎是一个数据错误,或者是在数据库中的数据中(这是SQLite3,它在插入数据时不检查字段的类型),或者在它的模型定义中(例如,在
clsql:def view class
中)。因此我认为首先要做的是查看数据库的数据,看看是否在关系中对应于
mtp组合
数据集id等于26且
组合id
等于0的记录(或记录)存在一些问题。
(defun get-composition (dataset-id composition-id)

 "Returns the composition whose dataset-id is <dataset-id> and whose
  composition-id is <composition-id>." 

 (car (clsql:select
        'mtp-composition
        :flatp t 
        :where [and [= [slot-value 'mtp-composition 'dataset-id] dataset-id]
                    [= [slot-value 'mtp-composition 'composition-id] composition-id]])))
* (parse-integer " 2 " :junk-allowed t)

2
2
*  (parse-integer "(2 " :junk-allowed t)

NIL
0