功能不在Racket中分配值

时间:2016-08-11 12:38:14

标签: 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-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

2 个答案:

答案 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)

无论如何,你不应该修改变量列表,只返回一个包含新值的列表。并且不要考虑改变列表 - 虽然 可能使用可变对来这样做,这不是处理这种情况的正确方法,请不要考虑改变你遇到的一切!