1

cl-openglパッケージからティーポットの例を実行しています。私が行った唯一の変更は、必要なパッケージをロードすることです。UNIXシェル(sbcl --load "3.cl")から実行すると正常に動作しますが、SLIME()を使用してコンパイルおよびロードしようとすると、C-c C-kパッケージGLUTが見つからないというエラーが発生します。

不思議なことに、コンパイラはでチョークし(defclass glut-teapot-window (glut:window)ます。何が得られますか?

これが何が起こるかのスクリーンショットです

3.clのコードは次のとおりです。

;;;; -*- Mode: lisp; indent-tabs-mode: nil -*-
;;; glut-teapot.lisp --- Simple usage of glut:solid-teapot.

    (ql:quickload :cl-opengl)

    (ql:quickload :cl-glu)
  (ql:quickload :cl-glut)

;(setf *communication-style* :fd-handler)

(defclass glut-teapot-window (glut:window)
  ()
  (:default-initargs :width 250 :height 250 :title "glut-teapot.lisp"
                     :mode '(:single :rgb :depth)))

(defmethod glut:display-window :before ((w glut-teapot-window))
  (gl:clear-color 0 0 0 0)
  (gl:cull-face :back)
  (gl:depth-func :less)
  (gl:disable :dither)
  (gl:shade-model :smooth)
  (gl:light-model :light-model-local-viewer 1)
  (gl:color-material :front :ambient-and-diffuse)
  (gl:enable :light0 :light1 :lighting :cull-face :depth-test))

(defmethod glut:display ((window glut-teapot-window))
  (gl:load-identity)
  (gl:translate 0 0 -5)
  (gl:rotate 30 1 1 0)
  (gl:light :light0 :position '(100 1000 1 0))
  (gl:light :light0 :diffuse '(1.2 0.4 0.6 0))
  (gl:light :light1 :position '(-100 1000 1 0))
  (gl:clear :color-buffer :depth-buffer)
  (gl:color 1 10 1)
  (gl:front-face :cw)
  (glut:solid-teapot 1.3)
;(glut:solid-torus 0.5 1.0 50 50)
;(glu:cylinder (glu:new-quadric) 0.5 0.5 0.5 20 20)
  (gl:front-face :ccw)
  (gl:flush))

(defmethod glut:reshape ((window glut-teapot-window) width height)
  (gl:viewport 0 0 width height)
  (gl:matrix-mode :projection)
  (gl:load-identity)
  (glu:perspective 50 (/ width height) 0.5 20)
  (gl:matrix-mode :modelview)
  (gl:load-identity))

(defmethod glut:keyboard ((window glut-teapot-window) key x y)
  (declare (ignore x y))
  (when (eql key #\Esc)
    (glut:destroy-current-window)))

(defun glut-teapot ()
  (glut:display-window (make-instance 'glut-teapot-window)))

(glut-teapot)
4

1 に答える 1

3

ファイルをロードすると、Lispシステムは式ごとにファイル式を読み取り、各式を読み取った後にそれらを実行します。

新しいLispでファイルをコンパイルすると、式が読み取られてコンパイルされます。しかし、それはそれらを実行しません。したがって、quickloadコマンドを確認してコンパイルしますが、実行はしません。このOpenGLコードはロードされておらず、パッケージはコンパイラに認識されていません。しかし、それは理にかなっています。コンパイルは通常、ファイルを実行するのではなく、ファイルをコンパイルする必要があります。Lispは、コンパイルされたfaslファイルをロードするときに式を実行します。

それを回避する2つの簡単な方法があります:

  1. クイックロード操作を別のファイルに入れ、次のファイルをコンパイルする前にコンパイル/実行します。
  2. EVAL-WHENロード操作をステートメントで囲みます。(eval-when (:execute :load-toplevel :compile-toplevel) ... your code here ...)

記号は:compile-toplevel、コンパイラがコードをトップレベルのフォームと見なしたときにコードが実行されることを意味します。そうでなければそれはしません。したがって、ファイルにコードを入れてコンパイルすると、副作用が発生します。ここでは、他のコードをロードします。

于 2013-02-22T18:25:30.203 に答える