Racket 函数不在球拍中赋值

Racket 函数不在球拍中赋值,racket,Racket,为什么以下函数(匹配重定义)不起作用 (define vlist (list 10 20 30)) (match-define (list aa bb cc) (list 1 2 3)) (define alist (list aa bb cc)) alist vlist (define (match-redefine dst_list src_list) (for ((d dst_list)(s src_list)) (set! d s)) ) (rnmatch-redefin

为什么以下函数(匹配重定义)不起作用

(define vlist (list 10 20 30))
(match-define (list aa bb cc) (list 1 2 3))
(define alist (list aa bb cc))
alist
vlist

(define (match-redefine dst_list src_list) 
  (for ((d dst_list)(s src_list)) (set! d s))    )

(rnmatch-redefine alist vlist)
alist
vlist
输出为:

'(1 2 3)
'(10 20 30)
'(1 2 3)
'(10 20 30)
0
0
0
'#(0 0 0)
0
0
0
"------- after ----------"
'(1 2 3)
0
0
0
"---------- first assignment -----------"
1
2
3
"---------- second assignment -----------"
10
20
30
"---------- individual access -----------"
10
30
目的地列表(列表)保持不变。这个功能能正常工作吗

编辑:我尝试了@OscarLopez在答案中建议的vector,但它不起作用:

(match-define (list a b c)  (list 0 0 0 )  )
(define variable_vect (vector a b c))
a
b
c

(define valuelist (list 1 2 3) )  
(for ((i variable_vect)(j valuelist))   ; does not work 
   (set! i j))
variable_vect
a
b
c

(set! variable_vect valuelist)
(println "------- after ----------")
variable_vect
a
b
c
输出为:

'(1 2 3)
'(10 20 30)
'(1 2 3)
'(10 20 30)
0
0
0
'#(0 0 0)
0
0
0
"------- after ----------"
'(1 2 3)
0
0
0
"---------- first assignment -----------"
1
2
3
"---------- second assignment -----------"
10
20
30
"---------- individual access -----------"
10
30
编辑:似乎我将不得不使用特殊类来应用:

(define myob%
  (class object%
    (super-new)
    (init-field val)
    (define/public (getval) val)
    (define/public (setval v) (set! val v))   ))

(define (copyvalues objlist valuelist)
  (for ((a alist)(v valuelist)) (send a setval v))  )

(define (show_objlist alist)
  (for ((a alist))  (println (send a getval)))  )

; USED AS FOLLOWS: 

(define ob1 (make-object myob% 5))
(define ob2 (make-object myob% 5))
(define ob3 (make-object myob% 5))
(define alist (list ob1 ob2 ob3))

(println "---------- first assignment -----------")
(define vlist (list 1 2 3))
(copyvalues alist vlist)
(show_objlist alist)

(println "---------- second assignment -----------")
(define ylist (list 10 20 30))
(copyvalues alist ylist)
(show_objlist alist)

(println "---------- individual access -----------")
(send ob1 getval)
(send ob3 getval)
输出为:

'(1 2 3)
'(10 20 30)
'(1 2 3)
'(10 20 30)
0
0
0
'#(0 0 0)
0
0
0
"------- after ----------"
'(1 2 3)
0
0
0
"---------- first assignment -----------"
1
2
3
"---------- second assignment -----------"
10
20
30
"---------- individual access -----------"
10
30

同样,这不是我们在计划中做事的方式。此外,您的代码只是重新分配一个指向列表中某个元素的局部变量,目标列表保持不变

您可以使用向量而不是列表-这些可以修改,就像您在最常见的编程语言中修改数组一样,如下所示:

(define value_list (list   1 2 3))
(define value_vect (vector 0 0 0))

value_vect
=> '#(0 0 0)

(for [(i (in-range (vector-length value_vect)))
      (value value_list)]
  (vector-set! value_vect i value))

value_vect
=> '#(1 2 3)

无论如何,您不应该修改变量列表,只需返回包含新值的列表即可。不要考虑改变列表-虽然可以使用可变对,但这不是处理这种情况的正确方法,请停止考虑改变你遇到的所有事情

您会问为什么该函数不起作用。 原因是
(set!ds)
正在做某事 你没有预料到

注意:

#lang racket
(define vlist (list 10 20 30))
(match-define (list aa bb cc) (list 1 2 3))
(define alist (list aa bb cc))
alist
vlist

(define (match-redefine dst_list src_list) 
  (for ((d dst_list)(s src_list))
    (set! d s)
    (displayln (~a "d is now: " s))))

(match-redefine alist vlist)
输出为:

'(1 2 3)
'(10 20 30)
d is now: 10
d is now: 20
d is now: 30
这意味着您要更改
d
的值(而不是与
d
所使用的符号相对应的变量值)


查看您在同一主题上的上一个问题。

您只是在修改局部变量
d
,我相信Racket的对无论如何都是不可变的。是否有任何特殊的关键字或函数使它们可变?您可以随时将语言更改为其中一个方案,或使用。但是,突变本身非常不规则,非常不稳定d变异参数更是如此。或者你可以切换到一种鼓励变异和命令式编程的编程语言,到目前为止,你正试图将Scheme用作其他东西。当你用
(for([x…])…)
遍历一个列表或一个向量时,
x
是一个(指向a的局部变量)值,不是引用。因此
set!
可以用另一个值替换该值,但它从来不是原始列表中的引用,或者vectorVector也不起作用。请参阅我问题中的“编辑”。@rn所以它不起作用,因为正如我所说,您只是重新分配了一个局部变量,而不是向量的内容-为此,您需要指定fy要修改的索引。请参阅我的更新。变量名a、b和c是否可以保留在向量中以单独使用?不,这不是任何编程语言中变量的工作方式。