Lisp 从SLIME运行时无法找到包,但从命令行可以
我在经营这个公司。我所做的唯一更改是加载所需的包。当从unix shell执行时,它可以正常工作(Lisp 从SLIME运行时无法找到包,但从命令行可以,lisp,common-lisp,slime,sbcl,Lisp,Common Lisp,Slime,Sbcl,我在经营这个公司。我所做的唯一更改是加载所需的包。当从unix shell执行时,它可以正常工作(sbcl--load“3.cl”),但是当我试图通过SLIME(C-C-k)编译并加载它时,我发现了关于包GLUT的错误 奇怪的是,编译器阻塞了(defclass-glut-teapot窗口(glut:window)。 什么给了 这是3.cl的代码 ;;;; -*- Mode: lisp; indent-tabs-mode: nil -*- ;;; glut-teapot.lisp --- Sim
sbcl--load“3.cl”
),但是当我试图通过SLIME(C-C-k
)编译并加载它时,我发现了关于包GLUT
的错误
奇怪的是,编译器阻塞了(defclass-glut-teapot窗口(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)
如果加载文件,Lisp系统将逐个表达式读取文件表达式,并在读取每个表达式后执行这些表达式 如果您在一个新的Lisp中编译文件,那么它会读取表达式并编译它们。但它不会执行它们。因此,它会看到quickload命令,编译它,但不会执行它。这个OpenGL代码没有加载,编译器也不知道包。但这是有道理的:编译器通常应该编译文件,而不是执行Lisp将在加载编译后的fasl文件时执行表达式 有两种简单的方法:
EVAL-WHEN
语句中。(EVAL-WHEN(:execute:load-toplevel:compile-toplevel)…此处的代码…
:compile top-level
符号意味着,当编译器将代码视为顶级形式时,代码将被执行。否则它不会执行。因此,您可以在文件中编译代码,从而产生副作用-在这里加载其他代码。谢谢!!现在有意义了。lisp是动态的,“懒惰的”当涉及到计算时。不,不是。编译与加载不同,如果您希望在编译过程中发生某些事情,您必须在何时使用eval进行安排。某些宏(例如,在包中)为您这样做,但根据定义函数不能。ql:quickload是一个函数。