Scheme 从定义本身的角度重新定义包含的定义

Scheme 从定义本身的角度重新定义包含的定义,scheme,racket,Scheme,Racket,以下所有内容都是一个更复杂问题的基本示例: 在另一个名为secondary_file.rkt的文件中,我有以下定义: (define work_hours '(8 8 8 7 5)) 现在让我们假设我想通过添加1来更改工作时间中的所有内容,但仍然想保留名称 在命令式编程中,我只会说工时[I]=工时[I]+1。 显然,这在函数式语言中是无法实现的,我也希望在不使用set的情况下实现这一点 比如说: (define work_hours_copy work_hours) (define work_

以下所有内容都是一个更复杂问题的基本示例:

在另一个名为secondary_file.rkt的文件中,我有以下定义:

(define work_hours '(8 8 8 7 5))
现在让我们假设我想通过添加1来更改工作时间中的所有内容,但仍然想保留名称

在命令式编程中,我只会说
工时[I]=工时[I]+1
。 显然,这在函数式语言中是无法实现的,我也希望在不使用
set的情况下实现这一点

比如说:

(define work_hours_copy work_hours)
(define work_hours (function_to_add_one_to_all_work_hours work_hours_copy ))
因此,本质上是复制工时<代码>工时复制,然后使用工时重新定义工时。工时复制有一个参数

但这不起作用,因为我会得到错误:

dictionary: undefined;
 cannot reference an identifier before its definition

你在正确的轨道上,你想要像这样的东西。参数的调用类似于函数,但其值可以(动态)设置

使用
make parameter
创建新参数,通常使用
parameterize
临时设置值

现在,您可以执行以下操作:

(define work-hours (make-parameter '(8 8 8 7 5)))
现在,当您直接引用
工时
时,您会得到一个函数:

> work-hours
#<procedure:parameter-procedure>
> (work-hours)
'(8 8 8 7 5)

用这种方式重新定义ie怎么样:
(定义工作时间(map 1+工作时间)
?这看起来像一个。为什么需要这样做?(一般来说,作为函数参数传递比依赖全局值要好。)您似乎在某处使用未定义的标识符
字典。
> (parameterize ([work-hours (map add1 (work-hours))])
    (work-hours))
'(9 9 9 8 6)