以下所有内容都是更复杂问题的基本示例:
在另一个名为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
答案 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)