Scheme 从定义本身的角度重新定义包含的定义
以下所有内容都是一个更复杂问题的基本示例: 在另一个名为secondary_file.rkt的文件中,我有以下定义: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_
(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)