LINUX.ORG.RU

Не работает функция

 


0

2
(defvar n)
(setq n 3)

(defun list-reverse (list)
  (do ((z 1 (- n 1))
       (x list (cdr x))
       (y '() (cons (car x) y)))
      ((= z 0)
       y)))

(list-reverse '(a b c d f e g)) => '(a b c)

и оно никак. Надо обязательно на do сделать, а то я с ним не разберусь.

Там люди вот такое выдают на do.

(defun factorial (n)
(do (( j n (- j 1))
(f 1 (* j f )))
((= j 0) f )))
(defun list-reverse (list n)
  (do ((n (- n 1))
       (x list (cdr x))
       (y '() (cons (car x) y)))
      ((= n 0) y)
    (print (list n x y))))

( LIST-REVERSE '(b n v g f k) 3)

(2 (B N V G F K) NIL) 
(2 (N V G F K) (B)) 
(2 (V G F K) (N B)) 
(2 (G F K) (V N B)) 
(2 (F K) (G V N B)) 
(2 (K) (F G V N B)) 
(2 NIL (K F G V N B)) 
(2 NIL (NIL K F G V N B)) 
(2 NIL (NIL NIL K F G V N B)) 
(2 NIL (NIL NIL NIL K F G V N B)) 
(2 NIL (NIL NIL NIL NIL K F G V N B)) 
(2 NIL (NIL NIL NIL NIL NIL K F G V N B)) 
(2 NIL (NIL NIL NIL NIL NIL NIL K F G V N B)) 
(2 NIL (NIL NIL NIL NIL NIL NIL NIL K F G V N B)) 
(2 NIL (NIL NIL NIL NIL NIL NIL NIL NIL K F G V N B)) 
(2 NIL (NIL NIL NIL NIL NIL NIL NIL NIL NIL K F G V N B)) 
(2 NIL (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL K F G V N B)) 
и т.д.

пока не понял почему

ну вот с + заработала

(defun list-reverse (list)
  (do ((n 0 (+ n 1))
       (x list (cdr x))
       (y '() (cons (car x) y)))
      ((= n 3) y)
    (print (list n x y))))
LIST-REVERSE
CL-USER> ( LIST-REVERSE '(b v c x z))

(0 (B V C X Z) NIL) 
(1 (V C X Z) (B)) 
(2 (C X Z) (V B)) 
(C V B)



Последнее исправление: saufesma (всего исправлений: 3)

Не уверен, что понял что нужно сделать, но

--- (do ((z 1 (- n 1))
+++ (do ((z n (- z 1))

работает

AlexKiriukha ★★★★
()
Последнее исправление: AlexKiriukha (всего исправлений: 3)
(defun list-reverse (list n)
  (do ((c n (1- c))
       (collected (list) (cons (first remaining) collected))
       (remaining list (rest remaining)))
      ((= c 0) collected)))

(z 1 (- n 1))

Так не работает же, z не меняется.

(n (- n 1))

А тут нет обновления (- n 1) используется как начальное значение, т.е. тоже не меняется.

(y '() (cons (car x) y)))

Всё хорошо, только литерал списка использовать нежелательно. Почему нежелательно объясняется в книжке On Lisp (ЕМНИП)

(defvar n) (setq n 3)

Зачем ты так пишешь, если можно (defvar n 3)? Звёздочки тоже желательно добавлять, а то непонятно, что n имеет динамическую видимость.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от no-such-file

(defun list-reverse (list n) (do ((c n (1- c)) (collected (list) (cons (first remaining) collected)) (remaining list (rest remaining))) ((= c 0) collected)))

очень интересует, где почитать о применении в do таких слов как collected, remaining.

saufesma
() автор топика
Ответ на: комментарий от no-such-file

Точно, но класс какой, я даже не подумал, что это переменные.

saufesma
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.