Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在Scheme(Racket)中更新列表_List_Scheme_Racket - Fatal编程技术网

List 如何在Scheme(Racket)中更新列表

List 如何在Scheme(Racket)中更新列表,list,scheme,racket,List,Scheme,Racket,如何将列表发送到单独的功能/过程,如何从列表中删除项目,如何更新新列表(项目已删除),如何从第一个功能/过程中显示列表 还有,我知道你可以使用set!更新列表,但我一直看到手册上说使用set!不是“方案方式” 但是,除此之外,我不知道如何创建此程序(不起作用): 谢谢 如果我写下你的代码: (displayer list1) 它将显示: (read id $$) 但如果我将其更改为: #lang racket (define list1 '("read" "id" "$$")) (def

如何将列表发送到单独的功能/过程,如何从列表中删除项目,如何更新新列表(项目已删除),如何从第一个功能/过程中显示列表

还有,我知道你可以使用set!更新列表,但我一直看到手册上说使用set!不是“方案方式”

但是,除此之外,我不知道如何创建此程序(不起作用):


谢谢

如果我写下你的代码:

(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)