什么是代码作为数据?我听说它比"code-as-ascii-characters"要好,但为什么呢?我个人认为代码作为数据的哲学实际上有点令人困惑.
我已经涉足了Scheme,但我从来没有真正得到整个代码作为数据的东西,并想知道它究竟是什么意思?
我Guile 1.8.8在OS X的口译员中练习Scheme .我发现了一些有趣的东西.
这里的expt函数基本上是取幂的expt(b,n) = b^n:
(define (square x) (* x x))
(define (even? x) (= (remainder x 2) 0))
(define (expt b n)
(cond ((= n 0) 1)
((even? n) (square (expt b (/ n 2))))
(else (* b (expt b (- n 1))))
))
Run Code Online (Sandbox Code Playgroud)
如果我尝试一些输入
> (expt 2 10)
1024
> (expt 2 63)
9223372036854775808
Run Code Online (Sandbox Code Playgroud)
这是一个奇怪的部分:
> (expt 2 64)
0
Run Code Online (Sandbox Code Playgroud)
更奇怪的是,直到n=488它停留在0:
> (expt 2 487)
0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Scheme中掌握call/cc的语义,并且关于continuation的Wikipedia页面以阴阳拼图为例:
(let* ((yin
((lambda (cc) (display #\@) cc) (call-with-current-continuation (lambda (c) c))))
(yang
((lambda (cc) (display #\*) cc) (call-with-current-continuation (lambda (c) c)))) )
(yin yang))
Run Code Online (Sandbox Code Playgroud)
它应该输出@*@**@***@****@...,但我不明白为什么; 我希望它输出@*@*********......
有人可以详细解释为什么阴阳拼图的工作方式有效吗?
在这段视频中,Rich Hickey为Lisp程序员介绍了Clojure.
在时间01:10:42,他在Clojure/Common Lisp/Scheme/Java中讨论了nil/false/end-of-sequence /'().他说:"计划是真实的,但它们是破碎的."

我不明白他为什么这么说,为什么他认为它"破碎"了?
什么是适合Windows的好IDE?好的,我会承认的; 我不是RMS的级别,并且不想使用Emacs或任何基于字符的界面 - 我想要一个带有着色的图形IDE,一个REPL,以及一个特定的,有良好记录的方言的可用的在线帮助计划.我已经四处寻找,PLT Scheme/DrScheme似乎是最好的,但即使这看起来也不太复杂.
我从来没有真正想过一个符号是否可以成为Lisp中的数字,所以我今天玩弄了它:
> '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2
Run Code Online (Sandbox Code Playgroud)
上面的代码是scheme,但它在Common Lisp和Clojure中看起来大致相同. 是否有1,并引述1之间有什么区别?
因此,我花了很多时间阅读并重新阅读The Little Schemer中第9章的结尾,其中应用Y组合器是为该length功能开发的.我认为我的困惑归结为一个单独的声明,对比两个版本的长度(在组合器被分解之前):
A:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0 )
(else (add1
((mk-length mk-length)
(cdr l))))))))
B:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
((lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(mk-length mk-length))))
Run Code Online (Sandbox Code Playgroud)
第170页(第4版)指出A.
当我们将它应用于参数时返回一个函数
而B
不返回功能
从而产生自我应用的无限回归.我很难过.如果B受到这个问题的困扰,我不知道A如何避免它.
我知道你可以使用'(aka quote)创建一个列表,我一直都在使用它,如下所示:
> (car '(1 2 3))
1
Run Code Online (Sandbox Code Playgroud)
但它并不总是像我期望的那样工作.例如,我试图创建一个函数列表,像这样,但它不起作用:
> (define math-fns '(+ - * /))
> (map (lambda (fn) (fn 1)) math-fns)
application: not a procedure;
expected a procedure that can be applied to arguments
given: '+
Run Code Online (Sandbox Code Playgroud)
当我使用时list,它的工作原理:
> (define math-fns (list + - * /))
> (map (lambda (fn) (fn 1)) math-fns)
'(1 -1 1 1)
Run Code Online (Sandbox Code Playgroud)
为什么?我认为'这只是一个方便的速记,为什么行为不同?
我抓住了学习函数式编程的bug.所以我的下一个自学项目是通过计算机程序的结构和解释.不幸的是,我从未学过Lisp,因为我不是大学的CS专业.
虽然SICP并不强调编程工具,但是练习需要选择一种类似Lisp的语言.似乎Scheme的一些实现将是阻力最小的路径.另一方面,我听说有人使用过Common Lisp和Clojure.在我看来,Common Lisp或Clojure更有可能在生产代码中使用,因此我的简历稍微好一点.顺便说一下,我完全认为学习语言本身就是值得的,但学习一种帮助我简历的语言仍然是一个好处.我是资本家,也是关于我学习的学者.
如果你不得不自学SICP,你会选择哪种语言?为什么?理想情况下,我想使用可以在JVM上运行的语言.我当然可以使用REPL与bash和emacs一起工作的语言.
附加:有没有人试过不使用Scheme阅读SICP?如果是这样,你的经历是什么样的?
scheme ×10
lisp ×4
clojure ×3
common-lisp ×3
ide ×2
quote ×2
callcc ×1
coding-style ×1
combinators ×1
evaluation ×1
guile ×1
mit-scheme ×1
null ×1
racket ×1
sicp ×1
y-combinator ×1