-
16-09-2020 - |
题
如何在方案中通过引用传递变量?
我想要的功能的示例:
(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。当然,你要记得 cons
和 car
在适当的时候。
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)
. jari是对的,它有点悬垂,至少是通过引用传递,至少是变量。但是,使用闭包的方式使用所需的行为,经常鼓励更多的方案。页面181182/18(谷歌书籍)在经验丰富的计划中做得更好,然后我可以解释它。
这里是一个引用,它给出了宏,允许您使用类似语法来“通过引用的c。”。Olegs网站是一个有趣的读物的金矿,所以如果你还没有,请务必预订标记它。
您可以从该外部上下文中定义的函数内影响外部上下文,这为您提供了通过参考变量的影响,即副作用。
(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不是功能概念。