Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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
Scheme 参考传递方案_Scheme_Pass By Reference_R6rs_Return By Reference - Fatal编程技术网

Scheme 参考传递方案

Scheme 参考传递方案,scheme,pass-by-reference,r6rs,return-by-reference,Scheme,Pass By Reference,R6rs,Return By Reference,如何在scheme中通过引用传递变量 我想要的功能示例如下: (define foo (lambda (&x) (set! x 5))) (define y 2) (foo y) (display y) ;outputs: 5 另外,是否有通过引用返回的方法?请参阅问题“是否有方法模拟通过引用调用?” 总的来说,我认为这与scheme的功能性相冲突,因此可能有更好的方法来构建程序,使其更像scheme。正如Jari所说,通常您希望避免在scheme中通过引用传递,因为

如何在scheme中通过引用传递变量

我想要的功能示例如下:

(define foo
  (lambda (&x)
    (set! x 5)))

(define y 2)

(foo y)

(display y) ;outputs: 5
另外,是否有通过引用返回的方法?

请参阅问题“是否有方法模拟通过引用调用?”


总的来说,我认为这与scheme的功能性相冲突,因此可能有更好的方法来构建程序,使其更像scheme。

正如Jari所说,通常您希望避免在scheme中通过引用传递,因为这表明您滥用了副作用

(define (outer-function)
  (define referenced-var 0)
  (define (fun-affects-outer-context) (set! referenced-var 12) (void))
  ;...
  (fun-affects-outer-context)
  (display referenced-var)
)
(outer-function) ; displays 12
不过,如果您愿意,您可以将任何要通过引用传递的内容包含在
cons
框中

(cons 5 (void))
将生成一个包含5个字符的框。如果将此框传递给将5更改为6的过程,则原始框也将包含6。当然,您必须记住在适当的时候使用
cons
car


Chez Scheme(以及可能的其他实现)有一个名为
box
(及其同伴
box?
unbox
)的过程,专门用于这种装箱/拆箱的废话:

您可能使用了太多的C、PHP或其他东西。 在scheme中,您不想做像pass-pass-*这样的事情。 首先了解作用域的含义以及不同实现的行为方式(特别是尝试找出LISP和Scheme之间的区别)

从本质上讲,纯函数式编程语言没有副作用。因此,这意味着传递参考不是一个功能概念

lambda

(define (foo getx setx)
  (setx (+ (getx) 5)))

(define y 2)
(display y)(newline)

(foo
 (lambda () y)
 (lambda (val) (set! y val)))

(display y)(newline)

Jari是对的,它有点像通过引用传递,至少是通过变量传递。然而,通过使用闭包,您想要的行为一直以一种更类似于方案的方式被使用,并且经常得到鼓励。(谷歌图书)在这个老练的计划中,我能更好地解释它

这里有一个引用,它提供了一个宏,允许您使用类似c的语法来“通过引用传递”。Olegs站点是有趣阅读的金矿,所以如果您还没有阅读过,请确保对其进行预订标记

您可以使用宏:

scheme@(guile-user)> (define-macro (foo var)`(set! ,var 5))
scheme@(guile-user)> (define y 2)
scheme@(guile-user)> (foo y)
scheme@(guile-user)> (display y)(newline)
5

您可以从在外部上下文中定义的函数中影响外部上下文,这会使您受到传递引用变量(即具有副作用的函数)的影响

(define (outer-function)
  (define referenced-var 0)
  (define (fun-affects-outer-context) (set! referenced-var 12) (void))
  ;...
  (fun-affects-outer-context)
  (display referenced-var)
)
(outer-function) ; displays 12
这种解决方案限制了副作用的范围

(define (outer-function)
  (define referenced-var 0)
  (define (fun-affects-outer-context) (set! referenced-var 12) (void))
  ;...
  (fun-affects-outer-context)
  (display referenced-var)
)
(outer-function) ; displays 12

除此之外,还有(定义x(框5)),(取消x x)等,正如Eli在子命令中提到的,这与二江建议的cons解决方案相同。

很酷,谢谢。很高兴知道这一点,但看起来我应该找到一个更好的方法来完成我正在尝试的工作:)这是一个很好的参考,可以用来模拟使用box的“by reference”参数——请注意,使用
box
unbox
set box的结果
非常接近于在C中使用显式指针。同样,很少使用这种东西,但在某些情况下它是有用的——Scheme鼓励函数式编程并阻止变异,但它并不反对这样做。(但在大多数情况下,新手代码这样做可能需要重新思考。)这似乎与问题的要求不同(即,
foo
这里需要两个参数,而不是一个)