Функция Common Lisp

#lisp #common-lisp

#lisp #common-lisp

Вопрос:

Я хочу создать функцию, которая проверяет, попадают ли номера списка в диапазон от 1 до 10 (включая 1 и 10). Если они это сделают, я хотел бы добавить ее в новый список, который я создал. Однако, если они не попадают в диапазон, я решил преобразовать их так, чтобы они соответствовали, а не отбрасывать их (путем добавления (1 (случайных 10)).

 (defun fit (lst)

  "(lst) check every number if it fits the range (1-10)"

  (do ((fit lst (cdr fit))

       (range nil))
      ((null fit) (reverse range))
    (if (and (>= fit 1) (=< fit 10))
        (seft ((cons fit range))))
       (or (< fit 1) (> fit 10)) 
           (cons (  fit (1  (random 10))) range)))
  

Коды начинаются с (defun fit …) . Однако это не работает, и мне не хватает каких-либо изменений, которые я могу внести, в основном из-за моих ограниченных знаний. Любая помощь или понимание будут высоко оценены.
Спасибо.

Ответ №1:

Я думаю, вы пытаетесь сделать слишком много работы самостоятельно. Подумайте о более высоких функциях. Ваша постановка задачи уже говорит вам половину этого: «проверьте каждое число, если оно вписывается в диапазон 1-10″.

Как насчет использования (каждого)? Затем вам нужно передать ей функцию, которая проверяет одно число. Вероятно, лямбда…

Ответ №2:

Как насчет этого:

 (defun fit (list)
  (cond ((null list) '())
        ((< (car list) 1)
         (fit (cons (  (car list) (random 10)) (cdr list))))
        ((> (car list) 10)
         (fit (cons (- (car list) (random 10)) (cdr list))))
        (t (cons (car list) (fit (cdr list))))))
  

Комментарии:

1. Спасибо!!! Ты вернул мне рассудок… Я не думал об использовании cond. Я подумал, что если я собираюсь перебирать это, лучший вариант — DO. Я очень ценю ваше время и усилия.

2. Использование цикла и СБОРА (или IF и COLLECT) также является опцией.

Ответ №3:

Я думаю, что вы хотите применить make-fitting функцию к каждому элементу.

 (defun make-fitting (n)
  (loop (incf n
              (cond ((> n 10) (- (1  (random 10))))
                    ((< n 1) (1  (random 10)))
                    (t (return-from make-fitting n))))))

(defun fit (list)
  (mapcar #'make-fitting list))
  

Если вы ожидаете других ограничений, вы должны указать их в качестве возможных необязательных параметров:

 (defun make-fitting (n amp;optional (low 1) (high 10))
  (let ((step-size (1  (- high low))))
    (flet ((random-step (size)
             (1  (random size))))
      (loop (incf n
                  (cond ((> n high) (- (random-step step-size)))
                        ((< n low) (random-step step-size))
                        (t (return-from make-fitting n))))))))