LINUX.ORG.RU

ошибка в do цикле(lisp)

 


0

1

Приветствую ребята!

Начинаю потихоньку разбираться с лиспом.

Есть такой код:

(defun render (scene width height filename)
  (let* ((image (make-instance 'zpng:png
                               :width width
                               :height height))
         (image-data (zpng:data-array image))
         (delta (* pi(/ (camera-fov (scene-camera scene)) 180.0)))
         (maxx (tan delta))
         (minx (- maxx))
         (maxy (* maxx (/ (coerce height 'single-float) (coerce width 'single-float))))
         (miny (- maxy))
         (stepx (/ (* 2 maxx) (coerce width 'single-float)))
         (stepy (/ (* 2 maxy) (coerce height 'single-float))))
    (do ((y 0 (1+ y)))
        ((>= y height))
      (do* ((x 0 (1+ x))
            (x-coord (+ minx (* x stepx)))
            (y-coord (+ miny (* y stepy)))
            (ray-dir (make-vector 3 :data (make-array 3
                                                      :element-type 'single-float
                                                      :initial-contents (vector x-coord y-coord 1)))
                     (make-vector 3 :data (make-array 3
                                                      :element-type 'single-float
                                                      :initial-contents (vector x-coord y-coord 1)))))
           ((>= x maxx))
        (setf (aref image-data y x 2) 255)))
    (zpng:write-png image filename :if-exists :supersede)))

sbcl говорит в строке (do ((y 0 (1+ y))) и (do* ((x 0 (1+ x)) (1+ y) и соответственно (1+ x) не достижимы так-же как и 2 предпоследнии строки.

Точная ошибка:

  note: 
    deleting unreachable code
    --> + 
    ==>
      CLRT-SCENE::Y

Не пойму почему.

★★★

make-vector

Не припомню такой функции в CL. Зато оно есть в EL.

Сейчас slime под рукой нет, в обед посмотрю в чём проблема.

naryl ★★★★★
()
Ответ на: комментарий от naryl

в данном контексте make-vector самописная ф-ция.

Сейчас slime под рукой нет, в обед посмотрю в чём проблема.

был бы признателен.

hope13 ★★★
() автор топика

Закрываешь пачку скобок - переноси строку. Экономь время на чтение.

Почитай

ados ★★★★★
()

Мне кажется, x-coord не хватает значения инициализации.

y-coord можно вычислять в предидущем цикле.

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

Видимо, оно намекает, что цикл по x не закончится, поэтому до (1+ y) дело не дойдёт.

Не дойдёт потому, что ошибочно написан цикл (do*). То есть, смотреть надо не на варнинг с unreachable code, а на то, что за ним. Твоя ошибка, видимо, в этом:

(make-array 3 :element-type 'single-float
              :initial-contents (vector x-coord y-coord 1) )

На это компилятор говорит, что

    Constant 1 conflicts with its asserted type SINGLE-FLOAT.

Исправление константы на 1.0 поправит ситуацию и с make-array, и с do.

ringill
()
Последнее исправление: ringill (всего исправлений: 1)
Ответ на: комментарий от ados

Мне кажется, x-coord не хватает значения инициализации.

Да. Синтаксически это не является ошибкой, но по факту значение x-coord вычислится только один раз, в начале цикла, и обновляться на последующих шагах не будет.

ringill
()
Ответ на: комментарий от korvin_

Тут dotimes достаточно.

Тут — да) Меня просто использование do напрямую «в повседневной жизни» несколько удивило.

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