为什么跟随功能(匹配重新定义)不起作用?
(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)
目的地列表(alist)保持不变。这个功能可以起作用吗?
编辑:我在答案中尝试了@OscarLopez建议的矢量,但它不起作用:
(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
输出是:
0
0
0
'#(0 0 0)
0
0
0
"------- after ----------"
'(1 2 3)
0
0
0
编辑:我似乎必须使用特殊类来应用它:
(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)
输出是:
"---------- first assignment -----------"
1
2
3
"---------- second assignment -----------"
10
20
30
"---------- individual access -----------"
10
30
答案 0 :(得分:2)
你问为什么功能不起作用。
原因是(set! d s)
正在做某事
你没想到。
观察:
#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
贯穿的符号对应的变量值。
请查看您之前关于同一主题的问题。
答案 1 :(得分:1)
同样,这不是我们在Scheme中做事的方式。此外,您的代码只是重新分配一个指向列表中元素的局部变量,目标列表保持不变。
您可以使用向量而不是列表 - 那些可以被修改,就像在最常见的编程语言中修改数组一样,如下所示:
(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)
无论如何,你不应该修改变量列表,只返回一个包含新值的列表。并且不要考虑改变列表 - 虽然 可能使用可变对来这样做,这不是处理这种情况的正确方法,请不要考虑改变你遇到的一切!