List 如何在Scheme(Racket)中更新列表
如何将列表发送到单独的功能/过程,如何从列表中删除项目,如何更新新列表(项目已删除),如何从第一个功能/过程中显示列表 还有,我知道你可以使用set!更新列表,但我一直看到手册上说使用set!不是“方案方式” 但是,除此之外,我不知道如何创建此程序(不起作用):List 如何在Scheme(Racket)中更新列表,list,scheme,racket,List,Scheme,Racket,如何将列表发送到单独的功能/过程,如何从列表中删除项目,如何更新新列表(项目已删除),如何从第一个功能/过程中显示列表 还有,我知道你可以使用set!更新列表,但我一直看到手册上说使用set!不是“方案方式” 但是,除此之外,我不知道如何创建此程序(不起作用): 谢谢 如果我写下你的代码: (displayer list1) 它将显示: (read id $$) 但如果我将其更改为: #lang racket (define list1 '("read" "id" "$$")) (def
谢谢 如果我写下你的代码:
(displayer list1)
它将显示:
(read id $$)
但如果我将其更改为:
#lang racket
(define list1 '("read" "id" "$$"))
(define (displayer list1)
(display (remover list1)))
(define (remover list1)
(remove "$$" list1))
你跑的时候就这样
(displayer list1)
它会回来的
(read id)
请记住,在函数式语言中,一切都是一个表达式,处理“变量”作为不可变变量是首选方式(无状态工作使程序更容易验证、优化和并行化,也更容易编写自动化工具来执行这些任务,请阅读此处的更多信息:)
,因此,如果要从列表中删除一个元素,然后显示,则必须编写一个函数,返回包含较少元素的新列表
另一方面,Racket不像Haskell那样是一种纯函数式语言,因此正如您所提到的,如果您真的想重新定义变量“list1”引用的值,您可以像下面这样使用Racket:
#lang racket
(define list1 '("read" "id" "$$"))
(define (displayer list1)
(set! list1 (remover list1))
(newline)
(display list1))
(define (remover list1)
(remove "$$" list1))
(define (displayer lst)
(let ((removed (remover lst)))
(newline)
(display removed)))
(define (remover lst)
(let ((removed (remove "$$" lst)))
(display removed)
removed))
(define list1 '("read" "id" "$$"))
(displayer list1)
> (read id)
> (read id)
集从现在起重定向列表1以指向新值
您可以在此处阅读更多关于此的信息:
返回已删除“$$”的list1
,但不会更改list1
。因此,解决方案是使用remover
call调用display:
(display (remover list1))
要重新实现remover
以删除“$$”,但没有其他副作用(输出是副作用):
正如问题所述,这真的,真的不是按计划行事的方式;然而,你可以通过
set实现你在球拍中的要求代码>-定义一个全局定义并选择一种允许重新定义初始绑定的语言-您必须混乱语言设置这一事实应该是一个非常明显的迹象,表明您做错了
不管怎么说,以下是方法:
(define list1 '("read" "id" "$$"))
(define (displayer)
(remover)
(newline)
(display list1))
(define (remover)
(set! list1 (remove "$$" list1))
(display list1))
(displayer)
> (read id)
> (read id)
一种更惯用的方法是避免定义全局变量来在过程中修改它们;而是每次需要修改列表时创建一个新列表(remove
创建一个新列表)并将其传递,如下所示:
#lang racket
(define list1 '("read" "id" "$$"))
(define (displayer list1)
(set! list1 (remover list1))
(newline)
(display list1))
(define (remover list1)
(remove "$$" list1))
(define (displayer lst)
(let ((removed (remover lst)))
(newline)
(display removed)))
(define (remover lst)
(let ((removed (remove "$$" lst)))
(display removed)
removed))
(define list1 '("read" "id" "$$"))
(displayer list1)
> (read id)
> (read id)
请注意,第二个解决方案没有修改list1
,这是解决问题的功能性方法
(define (displayer lst)
(let ((removed (remover lst)))
(newline)
(display removed)))
(define (remover lst)
(let ((removed (remove "$$" lst)))
(display removed)
removed))
(define list1 '("read" "id" "$$"))
(displayer list1)
> (read id)
> (read id)