标签: scheme

函数的参数太多了

我开始学习具有Java背景的Lisp.在SICP的练习中,学生应该创建具有许多参数的抽象函数,例如

 (define (filtered-accumulate combiner null-value term a next b filter)...)
Run Code Online (Sandbox Code Playgroud)

运动1.33.在Java(具有安全,静态类型规则的语言)中 - 一个包含4个以上参数的方法通常会闻起来,但是在Lisp/Scheme中它没有,是吗?我想知道你在函数中使用了多少个参数?如果你在生产中使用它,你会制作多少层吗?

lisp scheme arguments functional-programming function

7
推荐指数
1
解决办法
2161
查看次数

帮我写我的LISP :) LISP环境,Ruby Hashes

我正在Ruby中实现LISP的基本版本,以便熟悉一些概念.我的实现基于Peter Norvig的Lispy(http://norvig.com/lispy.html).

虽然这里有一些我想念的东西,但我会感激一些帮助......

他将Python的dict子类化如下:

class Env(dict):
    "An environment: a dict of {'var':val} pairs, with an outer Env."
    def __init__(self, parms=(), args=(), outer=None):
        self.update(zip(parms,args))
        self.outer = outer
    def find(self, var):
        "Find the innermost Env where var appears."
        return self if var in self else self.outer.find(var)
Run Code Online (Sandbox Code Playgroud)

然后,他继续解释为什么他这样做,而不仅仅是使用一个字典.然而,由于某种原因,他的解释不断透过我的眼睛,从我的脑后流出.

为什么不使用dict,然后在eval函数内部,当需要创建新的"子环境"时,只需获取现有的dict并更新需要更新的键/值对,并将新的dict传递给下一个评估?

Python解释器不会跟踪以前的"外部"环境吗?并且递归的性质不会确保将值从"内部"拉出到"外部"吗?

我正在使用Ruby,我尝试用这种方式实现.有些东西不起作用,可能是因为这个,或者可能不是.这是我的eval函数,env是常规哈希:

def eval(x, env = $global_env)
  ........ 
  elsif x[0] == "lambda" then
    ->(*args) { eval(x[2], env.merge(Hash[*x[1].zip(args).flatten(1)])) }
  ........ 
end
Run Code Online (Sandbox Code Playgroud)

当然,重要的是"lambda".

如果存在功能差异,那么我在这里做什么与Norvig对他的Env课程做了什么之间的重要区别?有人可以向我描述两者会偏离的情况吗?

如果没有区别,那么也许有人可以告诉我为什么Norvig使用Env类.谢谢 :)

ruby lisp python scheme programming-languages

7
推荐指数
1
解决办法
409
查看次数

你如何在Scheme中表达布尔否定?

在C和C++中,!否定结果:

if( !( a == b ) )
Run Code Online (Sandbox Code Playgroud)

在Scheme中,我发现只有eq?.我怎么说"不平等"?或者我们必须明确说出来

(eq? #f (eq? expr expr))
Run Code Online (Sandbox Code Playgroud)

scheme boolean-logic

7
推荐指数
1
解决办法
9283
查看次数

ARM处理器的Scheme编译器

是否有ARM处理器的Scheme编译器(不是解释器),特别是Cortex-M3?我正在寻找一个编译器,而不是一个解释器,以便在(相对)慢的处理器上获得可预测的小执行时间.它可能会省略规范的某些部分(可能是延续); 没关系.

我应该注意到我只有8 kB(可能是2-4倍)的RAM.

我将尝试使用答案中的所有内容,然后回复我的发现.这可能需要一些时间.

compiler-construction embedded scheme

7
推荐指数
1
解决办法
2226
查看次数

我想实现一个计划翻译来研究SICP

我正在读" 计算机程序的结构和解释 "一书,我想逐步编写一个计划解释器.

你知道最容易阅读(和简短)的方案的实施吗?我将在C中制作一个JavaScript.

javascript lisp scheme implementation sicp

7
推荐指数
2
解决办法
1967
查看次数

Lisp和Scheme中的WebSockets库?

哪些定期维护和稳定的库可用于使用Common Lisp或Scheme托管WebSocket服务器?

lisp scheme common-lisp

7
推荐指数
2
解决办法
1608
查看次数

Chibi Scheme - 简单的定义库示例不起作用

我写了下面的例子,试图在 Chibi Scheme 0.5.3 中试验 R7RS 库:

(define-library (example hello)
    (export hello-world)
    (import (scheme base))
    (begin
      (define (hello-world) "hello, world"))) 

(import (scheme write)
        (example hello))
(write (hello-world))
Run Code Online (Sandbox Code Playgroud)

不幸的是,在执行时,它会生成有关未定义变量的错误:

$ chibi-scheme  hello.scm 
ERROR: undefined variable: hello-world
Run Code Online (Sandbox Code Playgroud)

我一定犯了一个简单的错误,但没有看到它。有任何想法吗?

scheme chibi-scheme r7rs

7
推荐指数
1
解决办法
948
查看次数

什么是最低级别的数据结构?

我再次观看了一场SICP讲座,其中Sussman演示了如何实施Scheme cons car并且只cdr使用procudures.

它是这样的:

(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))
Run Code Online (Sandbox Code Playgroud)

这让我思考; 令人兴奋的是数据结构?创建语言时,数据结构是作为程序构建的抽象实现的吗?如果它们只是由程序组成,那么最低级别的程序是什么?

我想我想知道的是抽象链底部的东西(除非它恰好是抽象的一直向下).它在什么时候变成了硬件?

scheme abstraction sicp data-structures

7
推荐指数
2
解决办法
474
查看次数

如何在 Guile 中使用 SRFI-1?

我试图在诡计中使用 srfi-1。我使用以下代码来包含 srfi:
(use-modules (srfi srfi-1))

但是,我收到一条错误消息,说 srfi 可能未定义。我应该如何使用srfi?

我试着用谷歌搜索这个问题,但似乎我是第一个遇到这个问题的人。

scheme guile

7
推荐指数
1
解决办法
774
查看次数

如何有效利用Scheme中的惰性?

我正在尝试使用Scheme 中的代数数据类型对小型 lambda 演算进行编码。我希望它使用惰性求值,为此我尝试使用原语delayforce。然而,这对评估性能有很大的负面影响:小型测试用例的执行时间增加了 20 倍。

虽然我没想到懒惰会加速这个特定的测试用例,但我也没想到会出现巨大的减速。因此,我的问题是:是什么导致了延迟评估的巨大开销,以及如何在仍然进行延迟评估的同时避免这个问题?我已经很高兴能够将严格版本的执行时间缩短到 2 倍之内,但当然越快越好。

以下是我使用的测试用例的严格版本和惰性版本。该测试以一元表示法处理自然数:它构造一个2^24 sucs 后跟 a的序列zero,然后再次破坏结果。惰性版本是根据严格版本构建的,通过在适当的位置添加delay和,并添加- 绑定以避免多次强制参数。(我还尝试了一个版本,其中和是严格的,但其他函数是惰性的,但这比完全惰性的版本还要慢,所以我在这里省略了它。)forceletzerosuc

我使用compile-fileChez Scheme 9.5 编译了这两个程序,并.so使用petite --program. 严格版本的执行时间(仅限用户)为 0.578 秒,而惰性版本则需要 11,891 秒,几乎慢了 20 倍。

严格版

(define zero    'zero)
(define (suc x) (cons 'suc x))

(define one   (suc zero))
(define two   (suc one))
(define three (suc two))

(define (twice m)
  (if (eq? m zero)
      zero
      (suc (suc …
Run Code Online (Sandbox Code Playgroud)

performance scheme lazy-evaluation

7
推荐指数
1
解决办法
679
查看次数