根据自身重新定义包含的定义

时间:2018-04-23 23:03:23

标签: scheme racket

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

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

(define work_hours '(8 8 8 7 5))

现在让我们说我想通过添加1来改变work_hours中的所有内容,但仍希望保留名称。

在命令式编程中,我只想说work_hours[i] = work_hours[i] + 1。 显然,不能用函数式语言完成,我也想在不使用set!

的情况下这样做

这样的事情:

(define work_hours_copy work_hours)
(define work_hours (function_to_add_one_to_all_work_hours work_hours_copy ))

所以基本上复制work_hours work_hours_copy,然后使用work_hours_copy重新定义work_hours有一个参数。

但这不会奏效,因为我会收到错误:

dictionary: undefined;
 cannot reference an identifier before its definition

1 个答案:

答案 0 :(得分:1)

您正走在正确的轨道上,想要parameters之类的东西。参数被称为函数,但其​​值可以(动态)设置。

您使用make-parameter制作新参数,并且通常使用parameterize临时设置值。

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

(define work-hours (make-parameter '(8 8 8 7 5)))

现在,当您直接引用work-hours时,您将获得一个功能:

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

但是当你把它放在parameterize中时,你可以(暂时)根据其动态范围更改值:

> (parameterize ([work-hours (map add1 (work-hours))])
    (work-hours))
'(9 9 9 8 6)