根据定义,homoiconic这个词的意思是:
代码和数据的相同表示
在LISP中,这意味着您可以使用引用列表并对其进行评估,因此(car list)函数和(cdr list)参数也是如此.这可以在编译时或在运行时发生,但是它需要解释器.
没有编译时解释器的编译语言是否也可能是homoiconic?或者说同性恋的概念仅限于口译员?
如果我想学习Clojure,我应该从学习Scheme或Common Lisp开始吗?
或者Clojure与这两者有什么不同,我应该开始自己学习Clojure?
嘿,我是编程的新手.我已经选择了一些非常基本的Java(文件I/O,GUI,继承),并想看看函数式编程 - 特别是,我想学习Scheme.我在查找我能理解的Scheme实现时遇到了一些麻烦.口译员很奇怪; 我不确定如何保存我的程序和创建可执行文件.我已经下载了PLT Scheme,但我更喜欢使用一些不那么居高临下的东西,类似于NetBeans.是否有插件或工具可以让我快速轻松地创建和管理Scheme程序?所有帮助表示赞赏!
究竟是什么定义了"Lisp形式"?
据我所知,它是"一个原子或一个符号作为其第一个元素的列表".
但是,这(在Scheme中)不会是一种形式:
((lambda () 42)) ;; The answer to Life, the Universe and Everything.
Run Code Online (Sandbox Code Playgroud)
因为列表的第一个元素本身就是另一个列表.在评估之后,它将是一个程序(而不是符号).
我可以找到几个不同的网站和教程,讨论Lisp表单,但没有一个提供完整和详细的定义.我在哪里可以找到一个?
蟒蛇
当我学习Python时,我使用一个很好的gui安装程序在Windows上安装它,所有.py文件都会自动在命令行或资源管理器中运行python.
我发现这非常直观和容易,因为我可以立即制作纯文本文件并运行它们.
口齿不清
我开始学习lisp并且(从评论中)决定SBCL不是一个糟糕的lisp实现.
有没有办法设置SBCL像Python一样轻松运行.lisp文件?
是否有其他具有此功能的lisp实现?
我读过McCarthy 1960年关于LISP的论文,没有发现任何与用户定义的宏或正常的订单评估相似的内容.我想知道宏首次出现在编程语言历史中(以及Lisp历史中):
谢谢!
是否有任何库或函数为emacs lisp执行类似bash的glob扩展?
例如:
(directory-files-glob "~/Desktop/*")
> ("/home/user/Desktop/file1" "/home/user/Desktop/file2")
Run Code Online (Sandbox Code Playgroud)
如果没有这样的功能,是否有任何关于如何实施它的提示/建议?
编辑:
我在文档中发现了一个非常有用的函数:
file-expand-wildcards:此函数扩展通配符模式模式,返回与其匹配的文件名列表.
增加/减少数字和/或数字变量的惯用 Common Lisp方法是什么?
我已经尝试将我的clojure图表嵌入到UML中可用的内容中,使用类块作为文件级命名空间和依赖关系链接来显示关系,但它很尴尬并且往往会阻碍功能模式.我也尝试过开发ad-hoc解决方案,但是我发现一个解决方案和Java一样好用Java(简单有向图似乎工作模糊,但结果不详细足够).此外,我在网上找不到任何关于此的内容.
为了清楚起见,我并没有尝试像代码生成那样做任何事情; 我只是为了自己的利益而谈论纸笔图.我假设我不是第一个考虑使用lisp语言的人.
提出了哪些解决方案?有没有常用的标准?您有什么推荐的吗?你用什么工具?
我正在读O'Reilly的Clojure Programming book.
我找到了头部保留的例子.第一个例子保留对d(我推测)的引用,因此它不会收集垃圾:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d) (count t)])
;= #<OutOfMemoryError java.lang.OutOfMemoryError: Java heap space>
Run Code Online (Sandbox Code Playgroud)
虽然第二个例子不保留它,但它没有问题:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count t) (count d)])
;= [12 99999988]
Run Code Online (Sandbox Code Playgroud)
我没有得到的是在哪种情况下保留了什么以及为什么.如果我试着回来[(count d)],就像这样:
(let [[t d] (split-with #(< % 12) (range 1e8))]
[(count d)])
Run Code Online (Sandbox Code Playgroud)
它似乎创造了相同的内存问题.
此外,我记得count在每种情况下都会实现/评估一个序列.所以,我需要澄清一下.
如果我(count t)首先尝试返回,那么如果我根本不返回它会如何更快/更高效?在哪种情况下保留了什么?为什么?