如何在方案中通过引用传递变量?

我想要的功能的示例:

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

(define y 2)

(foo y)

(display y) ;outputs: 5

另外,有没有办法通过引用返回?

有帮助吗?

解决方案

http://community.schemewiki.org/?scheme-faq-language问题“有没有方法可以模拟逐个引用?”。

一般来说,我认为反对计划的功能性质,因此可能有更好的方法来构建程序,使其更加方案。

其他提示

就像 Jari 所说,通常您希望避免在方案中通过引用传递,因为这表明您正在滥用副作用。

不过,如果您愿意,可以将任何想要通过引用传递的内容包含在 cons 盒子。

(cons 5 (void))

将产生一个包含 5 个的盒子。如果您将此框传递给将 5 更改为 6 的过程,则原始框也将包含 6。当然,你要记得 conscar 在适当的时候。

Chez Scheme(以及可能的其他实现)有一个名为 box (及其同伴 box?unbox)专门针对这个装箱/拆箱的废话: http://www.scheme.com/csug8/objects.html#./objects:s43

您可以使用宏:

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
.

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)
.

您可以从该外部上下文中定义的函数内影响外部上下文,这为您提供了通过参考变量的影响,即副作用。

(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)等,如ELI的子项目中所述,它与Erjiriang所示的Cons解决方案相同。

你可能已经使用了太多的c,php或其他什么。 在方案中,您不想像通过一样做的东西 - *。 首先了解哪些范围的意思以及不同的实现方式(特别是尝试弄清楚LISP和方案之间的区别)。

通过本质,纯粹的功能编程语言没有副作用。因此,它意味着通过逐ref不是功能概念。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top