大家好,我想开始使用Scheme,我有两个问题.首先,您是否建议使用Scheme的解释器或编译器?为什么?第二,你会推荐哪种解释器或编译器,为什么?谢谢!
我在Common Lisp中完成了大部分的开发工作,但是有些时候我想切换到Scheme(在Small Pieces中读取Lisp,当我想要使用continuation时,或者当我想在Gauche中执行一些脚本编写时,例).在这种情况下,我不舒服的主要原因是我没有史莱姆(是的,你可以称我为瘾君子).
Scheme最接近史莱姆的是什么?具体来说,我最感兴趣的是:
let中定义的函数).(map |)(光标位置由|)表示),我想(map predicate . lists)在迷你缓冲区中看到我已经通过降低重要性来命令这些功能.
我的Scheme实现选择是:
如果它至少与它们一起工作会很棒.
我开始学习方案乐趣,如果有人使用它为生活作为主要编程语言...甚至作为一个额外的工具,编程库不知道?如果是这样,你用它做什么?你通常用什么样的问题来解决它?
有人可以解释什么是"不正确的清单"吗?
注意:谢谢大家!你们所有人摇滚!
在Haskell中,与许多其他函数语言一样,函数foldl被定义为例如foldl (-) 0 [1,2,3,4] = -10.
这没关系,因为foldl (-) 0 [1, 2,3,4]根据定义,((((0 - 1) - 2) - 3) - 4).
但是,在Racket中,(foldl - 0 '(1 2 3 4))是2,因为Racket"智能地"计算如下:(4 - (3 - (2 - (1 - 0)))),确实是2.
当然,如果我们定义辅助功能翻转,像这样:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
Run Code Online (Sandbox Code Playgroud)
然后我们可以在Racket中实现与Haskell相同的行为:而不是(foldl - 0 '(1 2 3 4))我们可以写:(foldl (flip -) 0 '(1 2 3 4))
问题是:为什么foldl球拍以这种奇怪的(非标准的,非直观的)方式定义,与其他语言不同?
我和The Little Schemer一起工作,学习Scheme并在我的环境中使用PLT-Scheme.
Little Schemer对递归给了我很大的帮助(现在对我来说很简单)但是我仍然坚持介绍"收藏家"这本书的一部分,并将整个函数称为一个延续.
这是他们使用的示例代码.我理解递归元素但是我被卡住了,特别是在lambda函数上 - 我的思想不能遵循路径以及如何设置lambda函数的参数(因为他们唯一的调用是在递归中再次调用它们,有功能体内没有具体用途).
如果有人能够或多或少地通过将函数递归到lambda收集器来分解计算路径,那可能对我有所帮助.
;; Build a nested list of even numbers by removing the odd ones from its
;; argument and simultaneously multiply the even numbers and sum the odd
;; numbers that occur in its argument.
(define (even-only-collector l col)
(cond
((null? l)
(col (quote ()) 1 0))
((atom? (car l))
(cond
((even? (car l))
(even-only-collector (cdr l)
(lambda (newl p s)
(col (cons (car l) newl)
(* (car l) …Run Code Online (Sandbox Code Playgroud) 好吧,这是一个相当基本的问题:我下面的SICP视频,我有点困惑之间的差异define,let和set!.
1)根据视频中的Sussman,define允许只附加一次值(在REPL中除外),特别是不允许两行定义.然而,Guile愉快地运行了这段代码
(define a 1)
(define a 2)
(write a)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样输出2.事情有点复杂,因为如果我尝试这样做(编辑:在上述定义之后)
(define a (1+ a))
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,而
(set! a (1+ a))
Run Code Online (Sandbox Code Playgroud)
被允许.我仍然不认为这是set!和define我之间的唯一区别:我错过了什么?
2)define和let我之间的区别更让我困惑.我知道理论上let用于绑定局部范围内的变量.尽管如此,在我看来,这也是一样的define,例如我可以替换
(define (f x)
(let ((a 1))
(+ a x)))
Run Code Online (Sandbox Code Playgroud)
同
(define (g x)
(define a 1)
(+ a x))
Run Code Online (Sandbox Code Playgroud)
和f和g工作相同:在特定的变量a是未结合的外面g为好.
我可以看到这个有用的唯一方法是let可能具有整个函数定义的更短范围.在我看来,总是可以添加一个匿名函数来创建必要的范围,并立即调用它,就像在javascript中一样.那么,真正的优势是let什么?
我想键入类似'scheme file.scm'的内容并让它解释文件,然后将我带回我的shell,而不是将其加载到REPL中.
编辑:我尝试了scheme <test.scm,它仍然使用REPL,唯一的区别是当流结束时方案退出.
有Gambit计划,麻省理工学院计划,PLT计划,鸡计划,Bigloo,Larceny,......; 然后有所有的lisps.
然而,就我所知,LLVM上没有(据我所知)一个流行的方案/ lisp,即使LLVM提供了很多很好的东西,比如:
那么为什么LLVM上没有一个好的方案/ lisp呢?
为了全能的爱,我还没有理解符号的目的'iamasymbol.我理解数字,布尔值,字符串...变量.但是符号对于我的小思维思维来说太过分了.我究竟用它做什么用的?它们应该如何在程序中使用?我对这个概念的把握只是失败了.