我不确定我是否理解正确,为什么在旧版本的Lisp中没有实现静态作用域,只有动态作用域.已经发明了Scheme的Sussman和Guy L. Steele Jr.只实现了静态范围.
我发现有时静态变量使用起来更方便,因为它们可以用作完美的状态持有者,尽管我们应该小心避免不希望的名称冲突,因为这是不希望的副作用.
我知道在编译期间检测到静态作用域,而动态作用域仅在运行时检测到.并且动态范围被认为是难以dubug,有时是为了推理.
如果我们把上面提到的事实放在一边,我不确定我理解为什么静态范围通常被认为比动态范围更好?
我正在为我的离散数学课解决一些问题,并阅读引起我注意的练习(注意:这不是作业.我只是纯粹好奇).
问题:为以下程序段执行"print"语句多少次?(i,j,k,m是整数):
for i := 1 to 20 do
for j := 1 to i do
for k := 1 to j do
for m := 1 to k do
print (i * j) + (k * m)
Run Code Online (Sandbox Code Playgroud)
我试图在python中做到这一点,但它很无聊因为我在几秒钟内完成了它.所以为了好玩,我尝试用DrRacket使用scheme作为语言.但是,在阅读关于循环的文档后,我似乎找不到这种循环的参考.所以,使用这个特定的例子(或者我猜一个具有无限数量循环的一般例子),如何解决这个问题呢?
(define (subtract-1 n)
(string-append "Number is: " (number->string n))
(cond
[(= n 0) "All done!"]
[else (subtract-1(- n 1))]))
Run Code Online (Sandbox Code Playgroud)
我不断收到错误消息:define:对于函数体,只期望一个表达式,但是发现了1个多余的部分。我不明白为什么要得到这个。
对自己的提示:使用DrRacket时,将语言设置为BSL可能会使Racket命令在编译时出错。
我最近正在学习计划并且对一个没有标识符就无法评估宏的设计感到好奇,而lambda(程序)可以这样做.
例如,我可以使用匿名lambda:
((lambda x x) 1 2 3)
Run Code Online (Sandbox Code Playgroud)
似乎我必须使用以下语法定义宏:
(define-macro my-macro (lambda x x))
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么这样的方法会像这样直接创建一个宏:
(define my-macro (macro-lambda x x))
Run Code Online (Sandbox Code Playgroud)
我想如果将宏和lambda视为不同的类型,第二个可能更优雅.
我的问题是:
define-macro办?lisp compiler-construction macros scheme functional-programming
在Scheme / Lisp中,我尝试创建一个将列表转换为循环列表的函数。因此,我相信我需要构造一个无限的流,其中列表的尾部指向列表的头部。
到目前为止,这是我的代码:
(define (rotate-list l1 l1copy)
(if (null? (force (cdr l1)))
(cons (car l1) (delay l1copy)))
(cons (car l1) (delay (rotate-list (force (cdr l1)) l1copy))))
Run Code Online (Sandbox Code Playgroud)
非常感谢所有帮助。
开始在Racket中选择GUI并立即插入标签.这就是对接的地方(要求代码找不到错误,我刚开始学习Racket):
#lang racket/gui
(define my-settings-hash (make-hash))
(define my-settings-hash "label" "Test")
(define my-settings-hash "width" 300)
(define my-settings-hash "height" 300)
(define my-tabs-list (list "Tab 0"
"Tab 1"
"Tab 2"))
(define root-wnd (new frame% [label (hash-ref my-settibgs-hash "label")]
[width (hash-ref my-settings-hash "width")]
[height (hash-ref my-settings-hash "height"]))
(define tab-panel (new tab-panel%
(parent root-wnd)
(choices my-tabs-list)
(callback
(lambda (tp e)
(case (send tp get-selection)
((0) (send tp change-children (lambda (children) (list a-panel))))
((1) (send tp change-children (lambda (children) (list b-panel))))
((2) (send tp change-children (lambda …Run Code Online (Sandbox Code Playgroud) 我想编写自己的追加,用于将元素追加到现有列表中.
我写了以下内容:
(define (appendElem llist elem)
(if (null? llist)
elem
(cons (car llist) (appendElem (cdr llist) elem))))
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时:
(appendElem (list 1 2 30) 11)
Run Code Online (Sandbox Code Playgroud)
我明白了:
(1 2 30 . 11)
Run Code Online (Sandbox Code Playgroud)
所以问题是,为什么(1 2 30 . 11)不(1 2 30 11)呢?
谢谢
编辑:
修正:
(define (appendElem llist elem)
(if (null? llist)
(list elem)
(cons (car llist) (appendElem (cdr llist) elem))))
Run Code Online (Sandbox Code Playgroud) 在球拍中,我定义了以下函数,我想知道它是否是尾递归的:
(define foo
(? (c m s1 s2)
(if (< c m)
(if (= (modulo m c) 0)
(foo (+ c 1) m (+ s1 c) s2)
(foo (+ c 2) m s1 (+ s2 c)))
(cons s1 s2))))
Run Code Online (Sandbox Code Playgroud)
我的问题几乎就是这样,但我必须写一些其他内容来满足我的帖子质量标准.实际上,我不知道我的帖子质量标准是什么.
我想按照以下方式定义一般功能:
(define (gen-func other-func)
(other-func))
Run Code Online (Sandbox Code Playgroud)
这将执行传递给它的函数.但是,我希望能够传递参数other-func.所以,如果我有:
(define (add-test a b c d)
(+ a b c d))
Run Code Online (Sandbox Code Playgroud)
和
(define (divide-test a b)
(/ a b))
Run Code Online (Sandbox Code Playgroud)
然后我就能做到
(gen-func divide-test 3 4)
Run Code Online (Sandbox Code Playgroud)
和
(gen-func add-test 1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
但它实际上会做我想要的(通过传递任意数量的参数来执行函数).这是我学习球拍的过程的一部分.
Modern Scheme(及其后代像Racket)具有非常强大的卫生宏系统.在我看来,quote和quasiquote定义(不卫生)宏已经失去了他们的历史地位(如Common Lisp中仍然做,如果我没有搞错吧)卫生系统的宏.其实在语言报告,quote并quasiquote仅作为构建数据的便捷方式,特别列出.如果她能够忍受乏味,那么人们可以没有它们.例如,(quote (+ 1 2))可以重写为(list (quote +) 1 2),(quasiquote (+ (unquote (- 2 1)) 2))可以重写为(list (quote +) (- 2 1) 2).
现在假设我们将符号的新原始类型引入Scheme:以大写字母开头的标识符是符号,否则是变量.所以X意味着符号x,然后上面的例子可以写成(list Plus 1 2)和(list Plus (- 2 1) 2).(我们假设它Plus代表符号+.)现在我们可以说quote并且quasiquote是多余的吗?或者我会错过什么?
编辑:
eval在一些罕见的情况下似乎仍然有用:在SCHEME中进行EVAL
澄清问题.