我正在尝试学习lisp,使用emacs方言,我有一个问题.让我们说list有一些成员,谓词的评估结果为false.如何在没有这些成员的情况下创建新列表?类似的东西{ A in L: p(A) is true }.在python中有过滤函数,在lisp中是否有相同的东西?如果没有,我该怎么办?
谢谢
我已经看到了这个问题,但它没有解释我在想什么.
当我第一次从Common Lisp来到Clojure时,我很困惑为什么它将符号和关键字视为单独的类型,但后来我想出来了,现在我觉得这是个好主意.现在我想弄清楚为什么符号和变量是单独的对象.
据我所知,Common Lisp实现通常使用一个结构代表一个"符号",该结构具有1)名称的字符串,2)在函数调用位置计算时指向符号值的指针,3)指向其值时的指针评估外部呼叫位置,以及4)财产清单等.
忽略Lisp-1/Lisp-2的区别,事实仍然是在CL中,"符号"对象直接指向其值.换句话说,CL结合了Clojure在单个对象中称为"符号"和"var"的内容.
在Clojure中,要评估符号,首先必须查找相应的var,然后必须取消引用var.为什么Clojure以这种方式工作?这样的设计可能会带来什么好处?我理解vars有一些特殊属性(它们可以是private,或const,或动态......),但这些属性不能简单地应用于符号本身吗?
将Common Lisp应用程序移植到Clojure有多实用?更具体地说,Common Lisp中存在哪些功能在Clojure中不存在,并且必须重新编写?
语言是否可以在没有括号的情况下使用Lisp强大的宏?
我一直在阅读一些Emacs Lisp软件包,并且遇到了一些函数的约定 - 在库前缀之后,例如:
(defun eproject--combine-regexps (regexp-list)
Run Code Online (Sandbox Code Playgroud)
我想知道这是否是向图书馆声明"私人"功能的惯例,但到目前为止我还没有在Emacs编码指南中找到任何内容.
现在,因为我3年前在AI上课,我非常熟练地提出这个问题......开个玩笑只是开玩笑;)
但严重的是,这些语言是什么使它们如此受人工智能研究的欢迎.即使人工智能研究"老"......它可能是过去5到10年中最长的方式......似乎是因为这些语言在某种程度上"设计"了人工智能的概念,或者仅仅是我们现在没什么好用的?
我问这个是因为我总觉得它非常有趣,我只是有点好奇.如果我完全错了,他们使用不同的语言,我很想知道他们使用的是什么.我的意思是我可以理解prolog,尤其是Sentient/Propositional Logic和Fuzzy逻辑.但我不明白"为什么"我们会使用Lisp ...甚至AI研究人员用来做机器学习等的其他内容.
关于主题的任何文章/书籍也是有帮助的:)
".el"是以Emacs Lisp程序结尾的文件名的约定.编写Common Lisp程序时的惯例是什么?
基本上,我什么时候应该使用Emacs Lisp的function程序?我还没有发现其中有行为上的差异,如果你函数作为参数传递的任何实例'like-this或#'like-this.事实上,如果我评估(eq 'goto-char #'goto-char)它返回t.
我遇到的Emacs Lisp代码很少使用function/ #'; 作者只是quote/ '一切.
例:(add-hook 'emacs-lisp-hook 'turn-on-eldoc-mode)
但是,我可以找到一些反例.这是Emacs 24.3源代码中的一个electric.el:
(add-hook 'post-self-insert-hook
#'electric-indent-post-self-insert-function
'append)
Run Code Online (Sandbox Code Playgroud)
(do-something '(lambda … (do-something (lambda …'和#',只要我使用一个版本的Emacs超过最近X?我应该如何监控clojure中映射函数的进度?
当用命令语言处理记录时,我经常每隔一段时间打印一条消息,以指示事情已经走了多远,例如报告每1000条记录.基本上这是计算循环重复.
我想知道在clojure中我可以采取什么方法,我将一个函数映射到我的记录序列.在这种情况下,打印消息(甚至保持进度计数)似乎基本上是副作用.
到目前为止我想出的是:
(defn report
[report-every val cnt]
(if (= 0 (mod cnt report-every))
(println "Done" cnt))
val)
(defn report-progress
[report-every aseq]
(map (fn [val cnt]
(report report-every val cnt))
aseq
(iterate inc 1)))
Run Code Online (Sandbox Code Playgroud)
例如:
user> (doall (report-progress 2 (range 10)))
Done 2
Done 4
Done 6
Done 8
Done 10
(0 1 2 3 4 5 6 7 8 9)
Run Code Online (Sandbox Code Playgroud)
是否有其他(更好)的方法来实现这种效果?
我在做什么有任何陷阱?(我认为我保留了懒惰,而不是举个例子.)