有人可以建议解释同性恋概念的文章,特别是使用Clojure.为什么Clojure是homoiconic,但在其他语言如Java中很难做到这一点?
对此非常好奇,从我自己的经验来看,所有的图形编程似乎都与C或C++有关.像Direct10X一样.函数式编程语言是否提供某种图形库来开发视频游戏?
其中一个花时间评论我关于Clojure/LISP语法的另一个问题的人指出我没有用标准的LISP方式编写我的示例代码.所以他很友好地重写了代码片段,这是一个很大的帮助.但它在我的脑海里提出了另一个问题.为什么这样:
(if (= a something)
(if (= b otherthing)
(foo)))
Run Code Online (Sandbox Code Playgroud)
这是标准的LISP格式,可以使用这种形式:
(if (= a something)
(if (= b otherthing)
(foo)
)
)
Run Code Online (Sandbox Code Playgroud)
这是因为我的C++开发背景,我会天真地格式化这段代码的方式.我想知道后一种格式化是否有任何好处,或者它只是一种根深蒂固的标准(如QWERTY键盘).我不是要争论 - 我很难理解为什么第一种形式会更好.第二种形式帮助我更容易地看到代码结构.
什么是代码作为数据?我听说它比"code-as-ascii-characters"要好,但为什么呢?我个人认为代码作为数据的哲学实际上有点令人困惑.
我已经涉足了Scheme,但我从来没有真正得到整个代码作为数据的东西,并想知道它究竟是什么意思?
我是字节编译模块.它给了我这个警告:
Warning: cl package required at runtime
Run Code Online (Sandbox Code Playgroud)
为什么这是一个警告?我很清楚我正在使用这个cl包.事实上(require 'cl),模块中有一个声明.
使用这些cl东西有什么问题吗?
如果是,是否有已发布的变通方法列表?我使用的主要内容是mapcan和delete-duplicates.
是否有任何良好的跨平台(至少是SBCL和CLISP)易于安装的GUI库?
我发现自己依附于一个项目,将一个解释器整合到一个现有的应用程序中.要解释的语言是Lisp的衍生物,具有特定于应用程序的内置.各个"程序"将在应用程序中以批处理方式运行.
我很惊讶多年来我编写了几个编译器和几个数据语言翻译器/解析器,但我以前从未真正编写过翻译器.原型很远,用C++实现为语法树walker.我可能会影响原型之外的架构,但不能影响实现语言(C++).所以,约束:
我真正想要的是阅读有关实施口译员基础知识的材料.我做了一些浏览SO,另一个名为Lambda the Ultimate的网站,虽然他们更倾向于编程语言理论.
到目前为止我收集的一些花絮:
Lisp in Small Pieces,作者:Christian Queinnec.推荐它的人说它"从简单的解释器到更高级的技术并完成呈现字节码和'Scheme to C'编译器."
NekoVM.正如我上面提到的,我怀疑我们是否可以合并整个VM框架来支持这个项目.
计算机程序的结构与解释.最初我建议这可能是矫枉过正,但是通过一个健康的块,我同意@JBF.信息量大,思维扩张.
关于保罗格雷厄姆的Lisp.我已经读过这篇文章,虽然它是对Lisp原理的一个信息性介绍,但还不足以快速开始构建一个解释器.
鹦鹉实施.这看起来很有趣.不确定它会为我提供基本面.
来自Scratch的计划.Peter Michaux正在攻击Scheme的各种实现,从用C编写的快速脏方案解释器(用作后续项目中的引导程序)到编译的Scheme代码.到目前为止非常有趣.
语言实现模式:创建自己的特定于域的和通用编程语言,在关于创建解释语言的书籍的注释主题中推荐.这本书包含两章专门介绍构建解释器的实践,所以我将它添加到我的阅读队列中.
那怎么样?是否有一本很好的书,用手拿新手,并展示了如何在C/C++中为类似Lisp的语言构建一个解释器?您是否喜欢语法树步行器或字节码解释器?
回答@JBF:
当前的原型是一个解释器,当我们接受任意代码文件的路径并在我们的应用程序环境中执行它时,它对我有意义.内置函数用于影响我们的内存数据表示.
它不应该是非常缓慢.目前的树木行走者似乎可以接受.
该语言基于 Lisp,但不是Lisp,因此不需要符合标准.
对于其他海报,我也会检查你的引文.谢谢,全部!
我想Scanner在clojure程序中创建一个Java 类的本地实例.为什么这不起作用:
; gives me: count not supported on this type: Symbol
(let s (new Scanner "a b c"))
Run Code Online (Sandbox Code Playgroud)
但它会让我创建一个像这样的全局实例:
(def s (new Scanner "a b c"))
Run Code Online (Sandbox Code Playgroud)
我的印象是唯一的区别是范围,但显然不是.let和之间有什么区别def?
Lisp中的同质性很容易看出:
(+ 1 2)
既是函数调用+与1,2作为参数,以及作为含有一个列表+,1和2.它同时是代码和数据.
但是,像朱莉娅这样的语言:
1 + 2
我知道我们可以Expr在Julia中将其解析为:
:(1 + 2)
然后我们可以获得AST并操纵它:
julia> Meta.show_sexpr(:(1+2))
(:call, :+, 1, 2)
因此,我们可以在Julia(和Elixir)中操纵程序的AST.但它们是否与Lisp一样具有同音性 - 任何代码片段实际上只是语言本身的数据结构吗?
我不知道1 + 2Julia中的代码是如何立即像(+ 1 2)Lisp中的数据一样只是一个列表.它仍然是杀人的吗?
通常代码如下所示:
(one-thing
(another-thing arg1 (f arg5 r))
(another-thing arg1 (f arg5 r)))
Run Code Online (Sandbox Code Playgroud)
为什么不喜欢这个?:
(one-thing
(another-thing arg1 (f arg5 r))
(another-thing arg1 (f arg5 r))
)
Run Code Online (Sandbox Code Playgroud)
它允许更容易地添加和删除"另一个东西"行(不删除和重新添加尾部右括号).你也可以对那个单独的右括号(例如";循环结束")发表一些评论.
当我使用第二种风格的代码与使用第一种风格的现有代码混合时有多糟糕?
lisp ×10
clojure ×5
common-lisp ×3
coding-style ×2
c++ ×1
emacs ×1
function ×1
interpreter ×1
julia ×1
let ×1
parentheses ×1
scheme ×1