我已经尝试过Lisp(实际上是Scheme)并发现它是一种非常漂亮的语言,我有兴趣学习更多.但是,似乎Lisp从未在严肃的项目中使用过,而且我没有看到它被列为任何职位发布所需的技能.我有兴趣听到任何使用过Lisp或者在"现实世界"中使用它的人,或者谁知道它是否被认为是纯粹的学术语言.
我需要一些帮助来理解Paul Graham的What What Lisp Different中的一些观点.
一个新的变量概念.在Lisp中,所有变量都是有效的指针.值是具有类型而不是变量的值,分配或绑定变量意味着复制指针,而不是它们指向的内容.
符号类型.符号与字符串的不同之处在于您可以通过比较指针来测试相等性.
使用符号树的代码表示法.
整个语言始终可用.读取时间,编译时和运行时之间没有真正的区别.您可以在编译时编译或运行代码,同时在运行时读取或编译代码.
这些点意味着什么?它们在C或Java等语言中有何不同?除了Lisp系列语言之外的任何其他语言现在都有这些结构吗?
我知道Lisp和Scheme程序员通常会说eval除非必要,否则应该避免.我已经看到了几种编程语言的相同建议,但我还没有看到一个反对使用的明确论据列表eval.我在哪里可以找到使用中潜在问题的说明eval?
例如,我知道GOTO程序编程中的问题(使程序难以理解且难以维护,难以找到安全问题等),但我从未见过反对的论点eval.
有趣的GOTO是,相反的论点应该对延续有效,但我看到Schemers,例如,不会说延续是"邪恶的" - 你在使用时应该小心.他们更倾向于使用代码而eval不是代码使用continuation(据我所知 - 我可能是错的).
我读过Vector不是seqs,但列表是.我不确定使用一个在另一个上的理由是什么.似乎矢量被最多使用,但是有没有理由呢?
我想将一个值映射转换为另一个具有相同键但具有应用于值的函数的映射.我认为在clojure api中有这样做的功能,但我一直无法找到它.
这是我正在寻找的一个示例实现
(defn map-function-on-map-vals [m f]
(reduce (fn [altered-map [k v]] (assoc altered-map k (f v))) {} m))
(println (map-function-on-map-vals {:a "test" :b "testing"} #(.toUpperCase %)))
{:b TESTING, :a TEST}
Run Code Online (Sandbox Code Playgroud)
有人知道是否map-function-on-map-vals已经存在?我认为它确实(可能还有一个更好的名字).
我正在尝试理解clojure协议以及它们应该解决的问题.有没有人对clojure协议的最新情况有什么明确的解释?
我从其他方面了解其他Lisps(特别是Scheme).最近我一直在读关于Clojure的文章.我看到它有"符号"和"关键字".符号我很熟悉,但没有关键字.
其他Lisps有关键字吗?关键字如何与除了具有不同符号(即:冒号)之外的符号不同?
我理解reduce和之间的概念差异apply:
(reduce + (list 1 2 3 4 5))
; translates to: (+ (+ (+ (+ 1 2) 3) 4) 5)
(apply + (list 1 2 3 4 5))
; translates to: (+ 1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)
然而,哪一个更惯用的clojure?这种方式或其他方式有什么不同吗?从我的(有限的)性能测试来看,似乎reduce更快一些.
在Clojure中,我想结合两个列表来给出一对对,
> (zip '(1 2 3) '(4 5 6))
((1 4) (2 5) (3 6))
Run Code Online (Sandbox Code Playgroud)
在Haskell或Ruby中,该函数称为zip.实现它并不困难,但我想确保我没有错过Core或Contrib中的函数.
Core中有一个zip命名空间,但它被描述为提供对Zipper功能技术的访问,这似乎不是我所追求的.
以这种方式在Core中是否存在用于组合2个或更多列表的等效函数?
如果没有,是不是因为有一种惯用的方法使得函数不需要?
clojure ×10
lisp ×5
scheme ×4
common-lisp ×3
dictionary ×1
eval ×1
java ×1
keyword ×1
list ×1
map-function ×1
paul-graham ×1
protocols ×1
sequences ×1
vector ×1