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) 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)
格雷厄姆的陈述是错误的吗?
我希望能够使用已定义的类型作为参数特化器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吗?
有没有更好的办法?
假设您想要获取包中每个函数的 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。
有没有办法用宏来实现这一点?