小编Bag*_*ers的帖子

什么是宏观功能?

今天我正在玩宏,并看到术语宏功能出现在REPL中.我熟悉宏,编译器宏和读取器宏,但没有碰到这些.

CL-USER> (defmacro fnaa (&rest rest) `(lambda ,@rest))
  FNAA

CL-USER> #'fnaa
  #<CLOSURE (LAMBDA (&REST SB-C::ARGS) :IN MACRO-FUNCTION) {1003A6DD6B}>
Run Code Online (Sandbox Code Playgroud)

我检查了'fnaa并得到了这个:

#<SYMBOL {1003A40A5F}>
--------------------
Its name is: "FNAA"
It is unbound.
It a macro with macro-function: #<FUNCTION (MACRO-FUNCTION FNAA) {1003A610BB}>
It is internal to the package: COMMON-LISP-USER 
Property list: NIL
Run Code Online (Sandbox Code Playgroud)

我已经从CLHS读到了这个,但无法理解它是什么以及它做了什么

任何帮助阐明宏观功能的目的将不胜感激.

[编辑]从阅读本文看,该函数实现了扩展?嗯,这是有道理的,因为宏实际上只是一个在宏扩展时运行的函数(并导致代码),但如果这是正确的那么为什么"宏功能宏"的术语?

我感觉很亲密,但我还是不太明白

[再次编辑]好的,看看定义我得到了这个

macro n. 1. a macro form 2. a macro function. 3. a macro name. 
Run Code Online (Sandbox Code Playgroud)

那么宏的组合是什么,因此宏功能只是实现? …

macros sbcl common-lisp

7
推荐指数
1
解决办法
435
查看次数

sbcl是否考虑优化时函数是否有副作用?

我最近一直在阅读SBCL用户手册,并开始想知道标题问题.显然,一些lisps,例如clojure,禁止所有副作用,因此他们可以轻松地并行化代码.Common Lisp允许副作用,所以我想知道给定函数是"脏"还是"干净"的事实是否会影响它的编译.

例如,在CMUCL编译器手册中,让优化显示在许多情况下如何使用'let'绑定新变量比使用'setq'进行修改更有效.我想我在问是否为函数调用做了类似的事情.

我已经阅读了sbcl手册的相关部分,并在stackoverflow上提出了问题但无法找到答案.

sbcl common-lisp

7
推荐指数
1
解决办法
323
查看次数

Sharpsign Colon和Gensym之间的差异

我刚刚阅读了尖锐的冒号读取器宏,听起来它与gensym的效果非常相似

Sharpsign Colon:"介绍一个没有内嵌的符号"

Gensym:"创造并回归一个新鲜的,没有内容的符号"

所以一个简单的测试

CL-USER> #:dave
; Evaluation aborted on #<UNBOUND-VARIABLE DAVE {1002FF77D3}>.
CL-USER> (defparameter #:dave 1)
#:DAVE
CL-USER> #:dave
; Evaluation aborted on #<UNBOUND-VARIABLE DAVE {100324B493}>.
Run Code Online (Sandbox Code Playgroud)

冷却,以便它应该失败.

现在进行宏观测试

(defmacro test (x)
  (let ((blah '#:jim))
    `(let ((,blah ,x))
       (print ,blah))))

CL-USER> (test 10)

10 
10
CL-USER>
Run Code Online (Sandbox Code Playgroud)

甜,所以它可以像gensym一样使用.

对我而言,这看起来比gensym更清晰,结果明显相同.我确定我错过了一个至关重要的细节所以我的问题是,它是什么?

common-lisp reader-macro

7
推荐指数
2
解决办法
427
查看次数

专注于矢量和矩阵

我正在使用common-lisp进行实时图形实验,到目前为止它已经很棒了.我对速度的要求和与cffi的轻松兼容意味着我正在使用'typed'数组.代码中真正令人感到难看的一个区域是我的矩阵和矢量数学函数的泛型版本.由于CLOS无法专注于数组的长度,我正在做这样的事情:

(defun v+ (vec-a vec-b)
   (%v+ vec-a vec-b (length a) (length b)))

(defmethod %v+ (va vb (la (eql 3)) (lb (eql 3)))
   ***CODE HERE***)
Run Code Online (Sandbox Code Playgroud)

这有效,但感觉不对.我已经看到了各种CL实现的扩展,并听说了MOP的承诺.

我已经避开了这个,因为我担心它会破坏一些CL实现的功能,但我最近看到了Closer-to-Mop项目.

核心问题: MOP是否提供了一种更有效的长度专业化方法?我应该关注哪些领域/技术?

common-lisp clos generic-function mop

6
推荐指数
1
解决办法
169
查看次数

了解循环宏扩展

我扩展了下面的宏,看看它是如何工作的,发现自己有点困惑.

(loop for i below 4 collect i)
Run Code Online (Sandbox Code Playgroud)

扩展到(为了便于阅读,我已经清理了一点)

(block nil
  (let ((i 0))
    (declare (type (and number real) i))
    (let* ((list-head (list nil))
           (list-tail list-head))
      (tagbody
       sb-loop::next-loop
         (when (>= i 4) (go sb-loop::end-loop))
         (rplacd list-tail (setq list-tail (list i)))
         (setq i (1+ i))

         (print "-------") ;; added so I could see the lists grow
         (print list-head)
         (print list-tail)
         (print "-------")

         (go sb-loop::next-loop)
       sb-loop::end-loop
         (return-from nil (cdr list-head))))))
Run Code Online (Sandbox Code Playgroud)

..这里是运行上面的输出..

;; "-------" 
;; (NIL 0) 
;; (0) 
;; "-------" 
;; "-------" …
Run Code Online (Sandbox Code Playgroud)

macros loops common-lisp

5
推荐指数
1
解决办法
101
查看次数

指定者的本质是什么?

Svante通过在另一个答案中显示字符串指示符来引起我的注意:

(string= :& "&") -> T
Run Code Online (Sandbox Code Playgroud)

看看CLHS,他们说A designator is an object that denotes another object.哪个好,但由于这些是不同的对象,某种强制需要在某个地方发生.我的意思是,如果下面的列表指示符可以通过'非零原子'来满足,则某些逻辑存在于处理此问题的某处.

列表指示符 对象列表的指示符; 也就是说,一个表示列表的对象,它是以下之一:非零原子(表示单元素列表,其元素是非零原子)或正确的列表(表示自身).

我认为指示符可能是一个概念,例如,通用函数......但是来自CLHS的以下行...

除非另有说明,否则在所表示的对象可能被多次使用的情况下,无论对象是仅被强制一次还是每次必须使用对象时都发生强制,它都是依赖于实现的.

...然后看起来非常具体.

所以我的问题

  • 什么是如何在实现中实现指示符的示例?
  • 这种机制是否可由用户以任何方式扩展?
  • 这种机制在指定人员中是否一致?(看起来似乎有18种指示符)

干杯

common-lisp

5
推荐指数
2
解决办法
547
查看次数

填充指针是否会影响GC?

如果我有这个结构:

(defstruct foo
  (x 0 :type 'fixnum))
Run Code Online (Sandbox Code Playgroud)

而这个数组:

(defvar arr (make-array 0 :element-type 'foo :adjustable t :fill-pointer 0))
Run Code Online (Sandbox Code Playgroud)

然后执行以下操作:

(vector-push-extend (make-foo) arr)
(setf (fill-pointer arr) 0)
Run Code Online (Sandbox Code Playgroud)

foo在阵列中现在GC的候选人?

我从CLHS了解到它不活跃,但我不确定该状态的含义.

arrays common-lisp fill-pointer

5
推荐指数
1
解决办法
98
查看次数

让emacs在启动时打开电源

每当我启动emacs时,我会立即做一些事情:

M-x slime
M-x ido-mode
Run Code Online (Sandbox Code Playgroud)

我还打开了一些我一直使用的文件,因此它们可用作缓冲区:

C-x C-f ....
Run Code Online (Sandbox Code Playgroud)

当我进入缓冲区时,我会为该缓冲区(几乎所有缓冲区)执行此操作:

M-x visual-line-mode
Run Code Online (Sandbox Code Playgroud)

如果它是一个Lisp缓冲区,我也总是这样做:

M-x paredit-mode
M-x rainbow-delimiters-mode
M-x show-paren-mode
Run Code Online (Sandbox Code Playgroud)

有没有办法让emacs在我启动emacs和加载缓冲区时自动执行所有这些操作?

lisp emacs

4
推荐指数
1
解决办法
400
查看次数

专注于关键词的通用函数

Common Lisp中是否有一种方法可以创建一个泛型函数,其中专门的参数是关键字参数?

例如,而不是这样:

CL-USER> (defgeneric tst (a))
#<STANDARD-GENERIC-FUNCTION TST (0)>
CL-USER> (defmethod tst ((a list)) 
           (print a))
#<STANDARD-METHOD TST (LIST) {1004ECC903}>
Run Code Online (Sandbox Code Playgroud)

..which在参数'a'上指定.我想要以下内容:

CL-USER> (defgeneric tst (&key a))
#<STANDARD-GENERIC-FUNCTION TST (0)>
CL-USER> (defmethod tst (&key (a list)) 
           (print a))
#<STANDARD-METHOD TST (LIST) {1004ECC903}>
Run Code Online (Sandbox Code Playgroud)

显然,这与设置关键字参数的默认值的语法冲突,所以我有点卡住了.在实际的代码中,这个问题与我选择了不同的参数布局有关,所以这不是问题(并且引导起来有点整洁!)但是如果我再遇到这个问题,我想我最好问专家!

干杯全都

generics common-lisp

3
推荐指数
1
解决办法
180
查看次数

简单的OpenGL图像库(SOIL)使用已弃用的功能?

本教程说明了有关SOIL库的以下内容:

虽然SOIL包含从图像自动创建纹理的功能,但它使用现代OpenGL中不可用的功能.因此,我们将简单地使用SOIL作为图像加载器并自己创建纹理.

那没关系,但功能是什么?图书馆的其他功能同样受到影响吗?我有一个谷歌,但没有提出任何关于此的信息.我已经看到它在opengl es应用程序中使用,其中IIRC仅具有核心opengl功能.

任何人都可以对所有功能是否可疑或是否只是load_ogl_texture有所了解.

opengl soil

3
推荐指数
1
解决办法
2246
查看次数

宏符号如何处理阴影?

CLHS

symbol-macrolet在词法上为由符号命名的每个符号宏建立扩展函数。

...

let可以使对符号宏的使用成为阴影。

这允许以下代码起作用(在* b * x绑定为'1'内):

CT> (with-slots (x y z) *b* 
      (let ((x 10))
        (format nil "~a ~a ~a" x y z)))
"10 2 3"
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何通过符号宏让阴影遮挡哪些形式?我问是因为宏不能保证尚未重新定义let或用户尚未创建另一种形式来执行与let相同的工作。这是仅查找cl:let符号的特殊“哑巴”案例吗?还是有一些更先进的技术正在进行?

如果这个问题太模糊,我很乐意编辑,我很难阐明这个问题。

macros common-lisp

3
推荐指数
1
解决办法
235
查看次数

有什么方法可以转储/查看jni globalref池?

我最近正在做很多JNI工作,并且想监视(或至少转储)jni globalref池的内容。Google尚未提供任何帮助。

我注意到,如果您确实触发了globalref-pool耗尽,它会列出池中的前10个项目,因此我希望可以通过某种方法来解决。

java java-native-interface android android-ndk

1
推荐指数
1
解决办法
444
查看次数