【问题标题】:Using SBCL's profiler in my own package在我自己的包中使用 SBCL 的分析器
【发布时间】:2014-06-11 11:09:36
【问题描述】:

我想分析我的包中的一些代码。如果我在 REPL 中 (require :sb-sprof)(来自默认的 CL-USER 包),它可以工作。但是,如果我将这个 for 放入包内的代码中,我会收到 Package SB-SPROF does not exist 错误。

如果我将(:import-from #:sb-sprof with-profiling) 指令放在我的defpackage 中,它会导致The name "SB-SPROF" does not designate any package

那么,如何启用分析?

【问题讨论】:

  • 这缺乏真正诊断问题的实际细节:表达式、执行和实际错误。

标签: common-lisp sbcl


【解决方案1】:

您需要先评估require,然后再执行您自己的包的defpackagedefpackage 不会自动为您提供 require SB-PROF 模块。将require 视为某种“花式”load,它将模块加载到图像中。在加载过程中,模块的包被创建,只有在此之后,您才能从 defpackage 或通过阅读器 (sb-sprof:with-profiling) 引用它们。

通常,当我懒得do it right(或者如果它是“一次性”解决方案)时,我会使用一个小的“loadup.lisp”脚本,它可以确保我的所有依赖项都是呈现然后加载我自己的代码。这也确保了图像可以可靠地从新的 lisp 中复制出来。

类似的东西

;; Make sure, the dependencies are present

(ql:quickload '(whatever))             ;; Load a dependency via Quicklisp
(require :sb-something-else)           ;; ... or via some implementation-dependent repository
(asdf:oos 'asdf:load-op 'some-module)  ;; ... or via ASDF or ... or ... or ...

;; Now, load my own stuff 

(load "packages")
(load "something-important-1")
...

这些操作的顺序很重要;在正确加载这些模块之前,您不能在自己的包声明中引用依赖模块中的任何包。

【讨论】:

  • 当我使用in-package 切换到我的包时我不能require 模块之后会发生什么变化?
  • 为什么你不能要求它? defpackage:import-from 选项 require 任何事情;它期望引用的东西(包,符号)已经加载到图像中!确切的错误是什么?什么时候发生?
  • 如果我尝试在(in-package #:my-package) 之后调用(require :sb-sprof),我会得到READ error during COMPILE-FILE: Package SB-SPROF does not exist.
  • @tempestadept:你需要 require 包,而不是编译 require 操作。如果要在编译时执行 REQUIRE 操作,请使用 EVAL-WHEN。
  • 谢谢,这个问题我明白了
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 2010-09-30
  • 2019-12-06
  • 2016-11-23
  • 2019-03-08
  • 2021-09-05
相关资源
最近更新 更多