小编use*_*663的帖子

从命令行指定Python源文件编码

PEP0263指定了在源文件本身中声明Python源文件的编码的语法.

是否可以从命令行指定编码?

或者有没有理由说这可能是不受欢迎的?

我想的是:

$ python --encoding utf-8 myscript.py
Run Code Online (Sandbox Code Playgroud)

甚至:

$ PYTHONSOURCEENCODING=utf-8 python myscript.py
Run Code Online (Sandbox Code Playgroud)

python encoding command-line

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

macrolet是否禁止在本地定义的宏中进行递归调用?

Paul Graham 在其着作ANSI Common Lisp,第320页中写道macrolet:"就像flet,本地宏可能不会互相调用."

也许我误解了这一点,但我想不出任何方式可能是真的.宏不会相互调用,而是相互扩展,宏扩展的本质是这样的,它一直持续到范围中定义的所有宏都被扩展掉.

以下代码在我试过的Common Lisp的每个实现中都不同意Graham:

(macrolet ((jump (x) `(car ,x))
           (skip (x) `(jump ,x))
           (hop (x) `(skip ,x)))
  (hop '(1 2 3))) 

=> 1

(macrolet ((yin (n x)
             (if (zerop n)
                 `(cdr ,x)
                 `(yang ,(1- n) ,x)))
           (yang (n x)
             (if (zerop n)
                 `(car ,x)
                 `(yin ,(1- n) ,x))))
      (yin 6 '(1 2 3)))

=> (2 3)
Run Code Online (Sandbox Code Playgroud)

格雷厄姆的陈述是错误的吗?

macros recursion common-lisp

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

在defmethod中使用Common Lisp用户定义的类型

我希望能够使用已定义的类型作为参数特化器defmethod.动机是可读性和在后期更改的灵活性.像这样:

(deftype foo () 'fixnum)

(defmethod bar ((x foo)) ...)

(defmethod baz ((x foo)) ...)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.CLtL2说"表单deftype不会创建任何类."

所以我要写:

(defmethod bar ((x fixnum)) ...)

(defmethod baz ((x fixnum)) ...)
Run Code Online (Sandbox Code Playgroud)

另一种方法是定义一个被调用的类foo,它只不过是一个包装器,fixnum但对于像这样简单的东西来说,这不是一个不可接受的开销fixnum吗?

有没有更好的办法?

methods common-lisp clos dispatch deftype

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

如何将变量传递给函数 lambda 表达式

假设您想要获取包中每个函数的 lambda 列表。在 SBCL 上,使用iterate你可以做到这一点

(use-package :iterate)

(defun lambda-lists (package)
  (iter (for symbol in-package (find-package package))
        (collect (sb-introspect:function-type symbol))))
Run Code Online (Sandbox Code Playgroud)

为了更便携,你可以尝试这样的事情

(defun lambda-lists (package)
  (iter (for symbol in-package (find-package package))
        (collect (function-lambda-expression symbol))))
Run Code Online (Sandbox Code Playgroud)

但这是行不通的,因为它function-lambda-expression需要一个函数,而不是一个符号。类似的东西(function symbol)也不起作用,因为它创建了一个名为 的函数symbol,而不是一个名为 的值的函数symbol

有没有办法用宏来实现这一点?

function common-lisp

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