我想通过 Clozure CL 的外部函数接口调用 Windows API 函数,但我遇到了一些问题,因为我找到的文档相当稀缺。
作为一个足够丰富的示例,我尝试调用SHGetKnownFolderPath。它的签名是
HRESULT SHGetKnownFolderPath(const GUID &rfid, DWORD dwFlags,
HANDLE hToken, PWSTR *ppszPath );
Run Code Online (Sandbox Code Playgroud)
我可以使用以下命令来获取函数的入口点:
(open-shared-library "shell32.dll")
> #<SHLIB SHELL32.dll #x1234>
(external "SHGetKnownFolderPath")
> #<EXTERNAL-ENTRY-POINT "SHGetKnownFolderPath" (#x12345) SHELL32.dll #x123456>
Run Code Online (Sandbox Code Playgroud)
以下是我认为调用它的一般步骤,但我不确定每个步骤是如何进行的:
external-call。GUID(第一个参数)viadef-foreign-type或相关构造。CoTaskMemFree来释放 指向的内存*ppszPath。我对最终代码的一般形式的猜测是
(defun get-known-folder (guid)
(let ((ffi-guid (allocate-ffi-memory-from-guid guid))
(ffi-path ffi-version-of-nil)
(path nil))
(external-call "SHGetKnownFolderPath" ...) ;; Pass ffi-guid and ffi-path …Run Code Online (Sandbox Code Playgroud) SBCL可以成功加载hunchentoot.然而,CCL报道:
? (ql:quickload :hunchentoot)
To load "hunchentoot":
Load 1 ASDF system:
hunchentoot
; Loading "hunchentoot"
> Error: Unable to load any of the alternatives:
> ("libssl.so.0.9.8" "libssl.so" "libssl.so.4")
> While executing: CFFI::FL-ERROR, in process listener(1).
> Type :POP to abort, :R for a list of available restarts.
> Type :? for other options.nter code here
Run Code Online (Sandbox Code Playgroud)
任何建议表示赞赏!
我想使用步进函数来查看它如何达到预期输出,但它不起作用。
就像这个简单的例子:
(STEP (IF (ODDP 3) 'YES 'NO))
但什么也没发生。
有没有什么优化让我看不到跟踪步骤???
如何关闭它?
谢谢!
假设我有一个目录A和子目录B.我进入A并启动lisp.在那个lisp进程中,我想启动一个Python子进程,其中Python将B视为其当前工作目录.lisp进程需要在A中有cwd,而python进程在B中应该有cwd.我如何以跨平台,简单的方式执行此操作?
我正在寻找一种适用于CCL和SBCL的解决方案(可能使用'运行程序功能),适用于Windows,Linux和OS X.
我查看了CCL运行程序文档,我没有看到改变已启动进程的cwd的方法.
我看了Python命令行参数,我没有看到一个会改变python进程的cwd.
我想到了'cd B'的运行程序调用; python ...',但我不确定它是如何工作的,因为它真的运行了两个程序; cd,然后是python.
Python代码作为输入(作为文件)提供,因此我无法更改任何代码(通过添加os.chdir()调用或类似代码).
将python输入文件作为子进程启动的python包装器文件并不理想,因为我正在发送stdin并监听由lisp启动的python进程的stdout.在lisp和篡改输入文件的python进程之间添加另一个子进程意味着我需要做很多stout/stdin中继,并且我觉得这会很脆弱.
krzysz00的方法非常有效.由于目录更改是在lisp中处理的,因此在启动python进程之前,此方法将用于在不同的子目录(不仅仅是python)中启动其他进程.
对于文档,这是我的代码使用krzsz00的方法,适用于SBCL和CCL.请注意,它使用Hoyte的defmacro!来自Let Over Lambda的宏,可以轻松避免不必要的变量捕获:
#+:SBCL
(defun cwd (dir)
(sb-posix:chdir dir))
(defun getcwd ()
#+SBCL (sb-unix:posix-getcwd)
#+CCL (current-directory))
(defmacro! with-cwd (dir &body body)
`(let ((,g!cwd (getcwd)))
(unwind-protect (progn
(cwd ,dir)
,@body)
(cwd ,g!cwd))))
Run Code Online (Sandbox Code Playgroud)
用法:
(with-cwd "./B"
(run-program ...))
Run Code Online (Sandbox Code Playgroud) 我想取消定义一个班级及其所有方法,但经过对Googlore的彻底搜索后,我一直无法找到关于如何做到这一点的线索.
我正在使用Commmon Lisp的实现,称为CCL(Clozure CL).
我打电话(load "code.lisp")给CCL,然后意外删除了code.lisp.有没有办法让我检索源代码?CCL在内存中有没有它?
我收到包含asci密钥代码的关键事件,我想知道是否有任何简单的方法将它们转换为普通lisp中的实际密钥或字符.我正在使用不包含int-char的ccl实现(可能或可能不适用于此任务).
1)在ccl中制作图像的正确方法是什么?或者之间的确切区别是什么:
(compile-file "foo.lisp")和(progn (load "foo.lisp") (save-application "foo"))?
2)是否有可能加载多个图像(命令行首选)?
我需要测试一个字符串,看看它是否包含任何代码高于十进制127(扩展的ASCII代码)或低于32的字符.有没有任何非常好的方法来做这个或者我只需要遍历整个字符串和比较字符的字符代码?我正在使用常见的lisp实现CCL.
当我们启动 slime 时,它默认在 CL-USER 中启动。由于我经常使用特定的包,我想在 Slime 启动时自动打包到该包中。即我想省去执行以下操作的麻烦:
CL-USER> (ql:quickload :my-package)
CL-USER> (in-package my-package)
MY-PACKAGE>
Run Code Online (Sandbox Code Playgroud)
我尝试将以下代码放入我的 ccl-init.lisp 文件中,但包内代码不起作用:
(ql:quickload :my-package)
(in-package my-package)
Run Code Online (Sandbox Code Playgroud)