这里似乎是我可以从我刚刚完成的如何设计程序(简化球拍)课程中获得的两件最重要的事情,直接来自课程的讲义:
1)尾部调用优化,以及非功能语言的缺乏:
可悲的是,大多数其他语言不支持TAIL CALL OPTIMIZATION.换句话说,即使是尾调用,它们也会构建堆栈.
尾调用优化是在70年代中期发明的,远在大多数语言的主要元素开发之后.因为它们没有尾调用优化,所以这些语言提供了一组固定的LOOPING CONSTRUCTS,可以遍历任意大小的数据.
a)在没有特色的过程语言中,这种类型的优化有哪些等价物?b)使用那些等价物是否意味着我们避免在类似情况下在没有它的语言中建立堆栈?
2)变异和多核处理器
这种机制几乎是你编程的任何其他语言的基础.我们推迟到目前为止推出它有几个原因:
尽管是基础,但它却非常复杂
过度使用它会导致程序无法并行化(在多个处理器上运行).由于多核计算机现在很常见,因此仅在需要时使用突变的能力变得越来越重要
过度使用变异也会使程序难以理解,难以很好地测试它们
但是可变变量很重要,学习这个机制将为您提供更多准备工作Java,Python和许多其他语言.即使在这些语言中,您也希望使用称为"主要是函数式编程"的样式.
在学习本课程之前,我学习了一些Java,Python和C++,因此认为变异是理所当然的.现在已经被上述声明全部抛到了空中.我的问题是:
a)我在哪里可以找到有关第二篇子弹中建议内容的更多详细信息,以及如何处理这些内容,以及b)"大多数功能性编程"风格会出现什么样的模式,而不是更粗心的风格我可能本来会继续使用其他语言而不是参加这门课程?
scheme functional-programming tail-recursion mutability racket
我正在尝试学习Racket,并在此过程中尝试重写Python过滤器.我的代码中有以下一对函数:
def dlv(text):
"""
Returns True if the given text corresponds to the output of DLV
and False otherwise.
"""
return text.startswith("DLV") or \
text.startswith("{") or \
text.startswith("Best model")
def answer_sets(text):
"""
Returns a list comprised of all of the answer sets in the given text.
"""
if dlv(text):
# In the case where we are processing the output of DLV, each
# answer set is a comma-delimited sequence of literals enclosed
# in {}
regex = re.compile(r'\{(.*?)\}', re.MULTILINE)
else: …Run Code Online (Sandbox Code Playgroud) 我在网上找到的所有信息都是关于编写Web服务器的,但似乎很少有关于Web客户端有用的函数.理想情况下,我希望函数看起来像这样:
(website "http://www.google.com")
Run Code Online (Sandbox Code Playgroud)
并返回一个包含整个网页的字符串,但我会对任何有效的内容感到高兴.
我想将函数映射到哈希表中的值,如下所示:
(hash-map add1 (hash "apple" 1 "pear" 2))
=> #hash(("apple" . 2) ("pear" . 3))
Run Code Online (Sandbox Code Playgroud)
是否有库函数来执行此操作?有一个人也可以使用不可变的hashetables.
我看着PlaneT,但没有看到任何东西.
现在,如果这确实不存在,我会继续写下来.把这个变成球拍的礼节是什么?我只是将它分叉在github上并将其添加到标准库(和文档!)并提交拉取请求?或者我应该先把它作为一个飞机,然后要求它被移入?我想帮忙,但我不知道什么是'正确'的方式去做.
我想为我的程序构建一个本地数据库,该数据库必须填充用户优先设置,搜索网站等.
但我在互联网上找到的东西(谷歌和这个网站)只是一个来自服务器或本地数据库的数据库,具有特定的方言,独特的球拍,这是所有方案方言中最受欢迎的.
以下是数据库的racket文档中的信息:
据我所知,没有关于使用带球拍的本地数据库的信息或示例.
任何人都可以给出一个小例子来构造和使用带有scheme(racket)的本地数据库吗?
我想加载一个图像并在Racket中制作动画.我可以在Dr. Racket中轻松完成,但我正在使用Emacs和Geiser.要加载图像,我需要:
(require racket/draw)
Run Code Online (Sandbox Code Playgroud)
接下来,要将此图像绘制到屏幕上,我打算使用big-bang模块.要加载此模块,我必须:
(require 2thdp/image)
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
module: identifier already imported from: 2htdp/image
at: make-pen
in: racket/draw
errortrace...:
Run Code Online (Sandbox Code Playgroud)
这基本上意味着我不能两次导入相同的模块.但我需要这两个库.我该如何避免这个问题?
我正在使用DrRacket的列表缩写的开头语言,并希望递归地制作一个powerset但是无法弄清楚如何去做.我现在有这么多
(define
(powerset aL)
(cond
[(empty? aL) (list)]
Run Code Online (Sandbox Code Playgroud)
任何帮助都会很好.
如何在到达标准球拍中的最后一个表格之前从功能返回?这可以用于避免另一级别的缩进和形式嵌套.
在Common Lisp中有return,一种特殊形式的return-from.在Racket中有任何等价物,至少只能返回?
假设我有一些文件a.rkt:
#lang racket
(define a 12)
Run Code Online (Sandbox Code Playgroud)
我现在想要编写一些测试用例,使用b.rkt需要的文件a.rkt:
#lang racket
(require "a.rkt")
a
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以b.rkt识别定义的标识符a.rkt而不必provide从第一个文件中获取?(理想情况下,根本不需要更改第一个文件.)
我在require/provide的文档中没有立即看到任何内容.
常见的lisp和clojure
(defn function-name (arg1 arg2) (body))
Run Code Online (Sandbox Code Playgroud)
球拍/计划呢
(defn (function-name arg1 arg2) (body))
Run Code Online (Sandbox Code Playgroud)
后者对我更有意义,因为函数定义和调用的语法类似.前者的理由是什么?