我很惊讶PLTScheme中的"错误"功能.如果我有一个除零,它不会做任何其他递归,只是从调用堆栈出来并给我一个错误.
在所有功能之前是否存在隐含的延续?错误是否会丢弃调用堆栈?有没有人对此有任何想法?
我意识到这是一个总的n00b问题,但我很好奇,我想我可能会在这里获得比其他任何地方更好的解释.这是一个列表(我正在使用Dr. Scheme)
> (list 1 2 3)
(1 2 3)
Run Code Online (Sandbox Code Playgroud)
我认为这只是糖:
> (cons 1 (cons 2 (cons 3 null)))
(1 2 3)
Run Code Online (Sandbox Code Playgroud)
另一方面,这做了其他事情:
> (cons 1 (cons 2 3))
(1 2 . 3)
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么会有所不同?要求列表末尾的空值有什么意义?
为了为我的程序构建安装程序,我添加了一个"安装程序"Xcode项目/目标,它将所有需要的二进制文件复制到一个临时位置,然后运行必要的逻辑来构建程序包.
我遇到的问题是我想直接映射这个安装程序项目依赖于其他一些项目,以便每次我尝试构建安装程序项目时都构建它们(如果需要).
我将所有目标添加到安装程序的构建目标列表(在架构中),并按如下顺序排列:
Project A
Project B
Project C
Installer (self)
Run Code Online (Sandbox Code Playgroud)
但是当我做一个干净的构建时,我看到一个构建顺序(在构建日志中),如下所示:
Project C
Installer
Project A
Project B
Run Code Online (Sandbox Code Playgroud)
我需要强制执行某个构建顺序,否则安装程序将无法使用这些文件.XCode允许您在UI中更改这些项目的顺序,但顺序似乎没有做任何事情.有没有办法强制依赖的构建顺序?
现在我有
(define (push x a-list)
(set! a-list (cons a-list x)))
(define (pop a-list)
(let ((result (first a-list)))
(set! a-list (rest a-list))
result))
Run Code Online (Sandbox Code Playgroud)
但我得到了这个结果:
Welcome to DrScheme, version 4.2 [3m].
Language: Module; memory limit: 256 megabytes.
> (define my-list (list 1 2 3))
> (push 4 my-list)
> my-list
(1 2 3)
> (pop my-list)
1
> my-list
(1 2 3)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?是否有更好的方法来编写push,以便在结尾添加元素并弹出以便元素从第一个中删除?
所以,我使用scribble/lp模块使用plt-scheme编写我的第一个文字程序:
#lang scribble/lp
(require scribble/lp)
<<lp_scheme.ss>>
@chunk[<squarefunction>
(define (f x)
(* x x))]
Run Code Online (Sandbox Code Playgroud)
当然没有什么有用的.现在我有点想知道为什么我不会使用简单的注释,而不是文字编程结构.任何意见欢迎.如果有人可能有更多的曝光/曝光,那将是非常好的.有了它可能会更直观地解释良好记录的代码和使用Literate编程结构编写的代码之间的差异.
我只是在学习计划,但我希望能够少再重复一遍.
有没有办法可以为本地范围内的子表达式指定名称?
根据评论:
Haskell where子句
x = s * t
where s = 10
t = 20
Run Code Online (Sandbox Code Playgroud)
在这种情况下,x应为200.
我正在尝试为数字电子课程制作一个真值表生成器,因为这是我在业余时间玩得开心并且不评判我的方式.
Anywho,我想我有一个哈希,字符串等价于运算符作为键,以及与这些运算符对应的Scheme程序作为值.
例如
(define operator-table #hash(("+" . or)
("*" . and)))
所以我可以做点什么
(lambda (a b) ((hash-ref operator-table (string-ref input-str i)) a b))
Run Code Online (Sandbox Code Playgroud)
现在我意识到上面的内容可能无法正常工作,但是因为在我做对了之前我甚至无法修补它,因为显然and并且or在Scheme中很特别.在REPL,如果我输入not它回复#<procedure:not>.但是,如果我给它,and或者or,它说and: bad syntax in: and.是否有and我可以使用的程序版本?或者我必须制作一个lambda?或者我完全错过了什么?
我不只是从一开始就使用lambda的唯一原因是我不想失去内置的可变性能and[我可以做得(and #t #f)很好(and #t #f #f #t #f #t)].
我应该在哪里开始为PLT编写自定义语言?网上是否有任何信息(或者我正在监督的手册中的信息?)或现有语言是否包含此类任务的最佳参考?
先感谢您!
假设有两个函数,f和v.进一步假设v返回一个长度为n的列表,f期望正好有n个参数.我在Scheme中寻找正确的语法,将f应用于v返回的列表.
如果我使用语法(f (v v-arguments))然后我得到一个错误关于f期望n个参数但只接收一个参数(这是由v返回的列表).
如果我使用语法(f . (v v-arguments)),那么问题是传递给f的参数太多.
我能做的最好(对于f期望两个参数的情况)是这样的:
(let ((output-of-v (v v-arguments)))
(f (car output-of-v) (cadr output-of-v)))
Run Code Online (Sandbox Code Playgroud)
我相信一定有更好的方法,我会感激任何建议!