最近几个月我一直在广泛使用Emacs作为我的主要开发环境,现在我已经到了一个点,我想学习它自己的Emacs Lisp为Emacs写我自己的小东西并将它扩展到我的个人需求.
话虽如此,我还想学习Common Lisp一段时间,一起玩,探索一种新语言.我的问题是,我应该从哪里开始?请问Emacs Lisp能否为我提供必要的知识,以便以后更轻松地获取Common Lisp,反之亦然?我基本上对每条路径的效率感兴趣,以便在我最终决定从一种方言转移到另一种方言时最小化学习曲线.
Scheme为所有变量使用单个名称空间,无论它们是绑定到函数还是其他类型的值.Common Lisp将两者分开,这样标识符"hello"可以引用一个上下文中的函数,而另一个中引用一个字符串.
(注1:此问题需要上述示例;请随意编辑并添加一个,或通过电子邮件发送原作者,我会这样做.)
但是,在某些上下文中,例如将函数作为参数传递给其他函数,程序员必须通过使用明确区分他指定函数变量而不是非函数变量#'
,如:
(sort (list '(9 A) '(3 B) '(4 C)) #'< :key #'first)
我一直认为这有点像疣,但我最近遇到的一个论点是,这实际上是一个特征:
......重要的区别实际上在于形式的语法,而不在于对象的类型.在不了解所涉及的运行时值的情况下,很明显函数形式的第一个元素必须是函数.CL采用这一事实并使其成为语言的一部分,以及宏观和特殊形式,这些形式也可以(并且必须)静态地确定.所以我的问题是:当函数名称的主要用途出现在很少想要出现变量名的地方时,为什么你希望函数的名称和变量的名称在同一名称空间中?
考虑类名的情况:为什么名为FOO的类会阻止使用名为FOO的变量?我唯一一次通过名称FOO引用该类是在期望类名的上下文中.如果在极少数情况下我需要获取绑定到类名FOO的类对象,则有FIND-CLASS.
这个论点确实从经验中对我有所帮助; Haskell中有一个类似的字段名称,它也是用于访问字段的函数.这有点尴尬:
data Point = Point { x, y :: Double {- lots of other fields as well --} }
isOrigin p = (x p == 0) && (y p == 0)
Run Code Online (Sandbox Code Playgroud)
这是通过一些额外的语法解决的,NamedFieldPuns
扩展特别好:
isOrigin2 Point{x,y} = (x == 0) && (y == 0)
Run Code Online (Sandbox Code Playgroud)
那么,对于问题,超越一致性,Common Lisp vs. Scheme以及一般来说,所有值的单个命名空间与函数和非函数值的单独命名空间有哪些优点和缺点?
什么是最好的common-lisp Web框架?
我正在寻找适合开发商业Web应用程序并能够处理类似Stack Overflow的高流量站点的东西.它还应具有内置会话处理和其他类似功能.
当我开始从Practical Common Lisp学习CL时,就像书中所说的那样,我开始使用Allegro CL编译器.我停止使用它,因为它的商业,但免费的位没有给我留下深刻的印象.它需要连接到远程服务器才能获得一些许可.
我切换到'clisp'并使用它.现在,我听说过SBCL并计划开始使用它.
所以,问题是:各种ANSI CL实现有何不同?使用一个在另一个上的任何实际经验?
谢谢.
如何在Common Lisp中创建连续数字列表?
换句话说,什么是相同的Python range
在Common Lisp中的功能?
在Python中range(2, 10, 2)
返回[2, 4, 6, 8]
,第一个和最后一个参数是可选的.虽然Emacs Lisp有,但我找不到创建数字序列的惯用方法number-sequence
.
可以使用循环宏来模拟范围,但我想知道生成具有起点和终点以及步骤的数字序列的可接受方式.
例如,#'functionname
是否有必要?
增加/减少数字和/或数字变量的惯用 Common Lisp方法是什么?
另一个新手(Common)LISP问题:
基本上在大多数编程语言中,函数接受变量的引用而不仅仅是值,即通过引用传递而不是传递值.让我们说,为了简单起见,我想编写一个LISP函数来接收变量并将变量的值增加一:
(defun increase-by-one (var)
(setf var (+ var 1)))
Run Code Online (Sandbox Code Playgroud)
现在显然问题是这个函数只增加了堆栈上变量副本的值,而不是实际的原始变量.我也试图通过使用宏来取得成效,虽然我有这种感觉,使用宏是正确的方法.
我在LISP中一直打到这堵墙,我确信必须有办法解决这个问题,或者在LISP中我有没有想过这个问题的方法完全不同?这样的事情是如何在LISP中完成的?
编辑:多人建议使用incf
.我只用这个例子以简单的方式演示问题,我实际上并没有寻找重新实现incf.但无论如何,谢谢你的建议.
给定LISP eval函数的以下定义 - 添加defmacro
函数需要什么?(甚至只是评估一个宏)
(defun null. (x)
(eq x '()))
(defun and. (x y)
(cond (x (cond (y 't) ('t '())))
('t '())))
(defun not. (x)
(cond (x '())
('t 't)))
(defun append. (x y)
(cond ((null. x) y)
('t (cons (car x) (append. (cdr x) y)))))
(defun list. (x y)
(cons x (cons y '())))
(defun pair. (x y)
(cond ((and. (null. x) (null. y)) '())
((and. (not. (atom x)) (not. (atom y)))
(cons (list. (car …
Run Code Online (Sandbox Code Playgroud) 我想在Common Lisp中并行实现我的粒子滤波算法.粒子过滤和采样可以并行化,我想为我的4核机器做这个.我的问题是并行编程是否在CL中是可行的,如果可行,是否有任何良好的读数,关于在CL中开始并行计算的教程.