函数不在球拍中分配值
Function not assigning values in 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
编辑:看来我必须使用特殊的 class 来应用这个:
(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
同样,这不是我们在 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)
无论如何,您不应修改变量列表,只需 return 具有新值的列表即可。并且不要考虑改变列表 - 虽然它 是 可以使用可变对这样做,但这不是处理这种情况的正确方法,请停止考虑改变你遇到的一切!
你问为什么功能不起作用。
原因是 (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
贯穿的符号对应的变量的值。
查看您之前关于同一主题的问题。
为什么以下功能(匹配重定义)不起作用?
(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
编辑:看来我必须使用特殊的 class 来应用这个:
(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
同样,这不是我们在 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)
无论如何,您不应修改变量列表,只需 return 具有新值的列表即可。并且不要考虑改变列表 - 虽然它 是 可以使用可变对这样做,但这不是处理这种情况的正确方法,请停止考虑改变你遇到的一切!
你问为什么功能不起作用。
原因是 (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
贯穿的符号对应的变量的值。
查看您之前关于同一主题的问题。