LINUX.ORG.RU

Как сконструировать лист

 


0

1
(defvar *lst*)
(defvar *w-lst*)
(defvar *pos-min*)
(defvar *pos-max*)
(setq *lst* (list 45 1 2 3 4 5 6 7))
(setq *w-lst nil)
(setq *pos-min* 2)
(setq *pos-max* 3)

Как на выходе получить лист *w-lst* с элементами (1 2), сообразить не могу. Используемый язык elisp.

Получил я свой лист, сомнительным способом, может кто математически подскажет, а то может оказаться, что этот код только на этом листе и даёт правильный результат

(progn
(defvar *lst*)
(defvar *w-lst*)
(defvar *w-lst1*)
(defvar *pos-min*)
(defvar *pos-max*)
(setq *lst* (list 45 1 2 3 4 5 6 7))
(setq *w-lst* nil)
(setq *w-lst1* nil)
(setq *pos-min* 2)
(setq *pos-max* 3))

(defun list-cdr (w-lst1 lst pos-max)
  (if (< 0 pos-max)
      (make-list (push (car lst) w-lst1)
		 (setq lst (cdr lst))
	       (- pos-max 1))
    w-lst1))

(setq *w-lst1* (nreverse
(list-cdr *w-lst1* *lst* *pos-max*)))

(setq *w-lst1* (nthcdr (- *pos-min* 1) *w-lst1*))



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

(def-var *w-list* '(1 2))

Символ ' перед выражением – «цитата», возвращает выражение невычисленным. Выражение (def-var *w-lst* '(1 2)) вычисляется как def-var от аргументов *w-lst* и '(1 2), то есть, создать переменную *w-lst* со значением выражения '(1 2). QUOTE (она же символ ') здесь важна, так как иначе выражение (1 2) было бы необходимо вычислить, что привело бы к попытке применить 1 к аргументу 2, что, очевидно, неверно.

Siborgium ★★★★★
()
Последнее исправление: Siborgium (всего исправлений: 2)

(make-list (push (car lst) w-lst1) …)

Как оно вообще работает, если make-list первым аргументом длину списка хочет?

(let ((i 0)
      (res nil))
  (setq *w-lst*
        (dolist (c *lst* (nreverse res))
          (when (<= *pos-min* i *pos-max*)
            (setq res (cons c res)))
          (setq i (+ i 1)))))
monk ★★★★★
()
Ответ на: комментарий от monk

make-list была определена да я ее стер, вчера к вечеру уже не соображал. Все, что нужно у меня уже есть только не видел. А так спасибо за ответ.

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