Изменение значения по умолчанию :junk-allowed для parse-integer из функции верхнего уровня в LISP

Я работаю в emacs с LISP и столкнулся с ошибкой, которую не знаю, как обойти. Выложу вывод, что я из него понял и чего мне не хватает.

Ошибка:

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))

Итак, я хотел бы изменить :junk-allowed nil на t в parse-integer, но я не знаю, как это сделать, потому что я не знаю, где, когда и почему это вызывается. Функция get-event-sequence (написанная для этой конкретной программы) вызывает get-composition, что выглядит следующим образом:

(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]])))

Я не знаю, где это целое число синтаксического анализа вызывается из этой функции или как изменить значение этого ключевого слова. Кроме того, строка чисел представляет собой закодированные ключевые подписи и представляет все ключевые подписи в этом конкретном наборе данных, но почему это важно, когда эта функция, кажется, имеет дело только с dataset-id и composition-id? Спасибо за вашу помощь!


person sarah    schedule 25.06.2016    source источник
comment
Даже если бы вы могли указать истинное значение для разрешения нежелательной почты, это все равно не имело бы смысла при вводе, таком как (-5 -4 -3 -2 -1 0 1 2 3 4 5 6). parse-integer предназначен для анализа одного целого числа из строки, а не списка целых чисел.   -  person Joshua Taylor    schedule 26.06.2016
comment
Кажется, ошибка данных либо в данных внутри базы данных (это SQLite3, который не проверяет тип полей при вставке данных), либо в ее определении модели (внутри clsql:def-view-class , например). Поэтому я думаю, что первое, что нужно сделать, это просмотреть данные базы данных и посмотреть, есть ли в отношении (отношениях), соответствующих mtp-composition, какая-либо проблема с записью (или записями) с dataset-id равным 26 и composition-id равным 0.   -  person Renzo    schedule 26.06.2016


Ответы (1)


Глядя на обратную трассировку, мы видим, что parse-integer вызывается методом универсальной функции clsql-sys:read-sql-value.

Без проверки кода неясно, является ли этот :junk-allowed nil просто обратной трассировкой, показывающей вам значения по умолчанию, или он активно вызывается таким образом из метода.

Однако установка истинного значения на самом деле не поможет вам, так как возвращаемое значение будет nil (поскольку "(" не является числом или пробелом). Это означает, что существует более глубокая проблема с вашей базой данных, возможно из-за неявного нарушения схемы (вы сказали: «Я хочу хранить числа», затем сохранили список чисел, и ORM сделал что-то, от чего он не может восстановиться).

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

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

NIL
0
person Vatine    schedule 30.06.2016