Как сравнивать целые числа с значениями массива в LISP [duplicate]

Вы пытались решить проблему с клейкой лентой?

Попробуйте определить, когда возникают ошибки, и исправьте их короткими операторами if, это не очень, но для некоторых проблем это единственное решение, и это один из них .

 if( (n * 0.1) < 100.0 ) { return n * 0.1 - 0.000000000000001 ;}
                    else { return n * 0.1 + 0.000000000000001 ;}    

У меня была такая же проблема в проекте научной симуляции в c #, и я могу сказать вам, что если вы проигнорируете эффект бабочки, он превратится в большого толстого дракона и укусит вас в a **

8
задан Rainer Joswig 25 February 2016 в 16:11
поделиться

4 ответа

Правильно! Проблема находится в строке сразу после этого, где говорится

((cons nil lst) (append lst nil) (insertat nil lst 3) ...

. Вопрос - две открывающиеся круглые скобки. Скобки могут изменять значение в специальных контекстах (например, форма cond, которую вы используете), но в этом контексте круглые скобки означают регулярное приложение-функцию, как и вы, вероятно, привыкли. Это означает, что первое, что следует после круглых скобок, должно быть функцией. С точки зрения внешних круглых скобок первое, что есть (cons nil lst), поэтому должно быть функцией (которой это не так).

Обратите внимание, что вы не можете просто удалить скобки, потому что функция cons возвращает новый список, как вы хотите, но не меняет старый список. Вероятно, вы хотите что-то вроде этого:

(setq lst (cons nil lst))
(setq lst (append lst nil))
(setq lst (insertat nil lst 3))
...
6
ответ дан Noah Lavine 25 August 2018 в 09:47
поделиться

Чтобы исправить немедленную ошибку, вы можете просто добавить там PROGN (CONS NIL ...). PROGN работает, оценивая каждую форму в нем и возвращая в нее значение последней формы в качестве ее значения.

Однако ваша программа по-прежнему не будет делать то, что вы думаете, что она будет делать (я так думаю) , Знаете, в Common Lisp вы используете первый объект cons для представления всего непустого списка, и вы не можете просто заменить головные минусы. Лучший способ - вернуть новый список в качестве значения функции.

(defun insert (lst probe)
  (ecase (length lst)
    (0 (list probe))
    (1 (let ((c (first lst)))
         (if (<= probe c)
             (list probe c)
             (list c probe))))
    (2 (cond
         ((<= probe (first lst)) 
          (list probe (first lst) nil (second lst) nil))
         ((> probe (second lst))
          (list nil (first lst) nil (second lst) probe))
         (t
          (list nil (first lst) probe (second lst) nil))))))

Возможно, вы захотите (setf lst (insert lst [some-number])) при использовании этой функции.

2
ответ дан Charles Lew 25 August 2018 в 09:47
поделиться

Вы правы; на строке с пометкой «ошибка здесь», есть синтаксическая ошибка:

(defun insert (lst probe)
  (cond ((null lst) (cons probe lst))
        ((equal (length lst) 1)
         (if (<= probe (first lst))
             (cons probe lst)
             (append lst (list probe))))
        ((equal (length lst) 2)
         (#|Error is here|# (cons nil lst) (append lst nil) (insertat nil lst 3)
          (cond ((<= probe (second lst)) (insert (first lst) probe))
                ((> probe (fourth lst)) (insert (fifth lst) probe))
                (t (insert (third lst) probe)))))))

К компилятору / интерпретатору форма читается как вызов функции функции «f3», которая является не является функцией вообще. Компилятор здесь жалуется на использование составной формы в позиции «оператора», которая не является lambda (единственный вид составной формы, принятой в этой позиции.)

((cons nil lst)                         #| <-- Form in operator position |#
 (append lst nil)                       #| <-- First argument form |#
 (insertat nil lst 3)                   #| <-- Second argument form |#
 (cond ((<= probe (second lst)) (insert (first lst) probe)) #| Third argument |#
       ((> probe (fourth lst)) (insert (fifth lst) probe))
       (t (insert (third lst) probe))))

I ' d помочь с повторной формулировкой выражения, но я не уверен, что вы хотите сделать здесь.

1
ответ дан Dirk 25 August 2018 в 09:47
поделиться

Если вы правильно отделите функцию, вы увидите, что перед CONS NIL LST есть дополнительная скобка.

(defun insert (lst probe)
  (cond ((null lst) (cons probe lst))
        ((equal (length lst) 1)
         (if (<= probe (first lst))
             (cons probe lst)
           (append lst (list probe))))
        ((equal (length lst) 2)
         ((cons nil lst) (append lst nil) (insertat nil lst 3)
          (cond ((<= probe (second lst)) (insert (first lst) probe))
                ((> probe (fourth lst)) (insert (fifth lst) probe))
                (t (insert (third lst) probe)))))))

В большинстве Lisp IDE вы можете делать отступы. В LispWorks выберите все выражение и сделайте m-x область отступа.

7
ответ дан Rainer Joswig 25 August 2018 в 09:47
поделиться