【问题标题】:storing values in Scheme globally在 Scheme 中全局存储值
【发布时间】:2011-01-27 17:48:13
【问题描述】:

我需要执行一系列数学运算。函数的输入是n。

前两个运算是求和。使用 n.结果需要存储为变量以在以后的函数中使用。

例如。

main func(n)
       func1 (n)
         returns a1

       func2 (n)
         returns b1

       func4 
         uses b1 to compute c1

       etc....       

我已经创建了所有分离的函数,但需要使用一个只接收 n 的主函数,以及一种全局存储变量以供以后函数使用的方法(无需更改它们)。这些是前两个功能。

(define (main n)
 (define (a1func n)
   (let* ((a1 0))
   (let* ((i (- n 1)))
        (if (= n 1) 0
      (+(/ 1 i) (a1func(- n 1)))))))

 (define (a2func n)
   (let ((a2 0))
   (let ((i (- n 1)))
   (if (= n 1) 0
        (+(/ 1 (expt i 2)) (a2func(- n 1)))))))

  (define b1 
    (if (= n 1) 0
        (/(+ n 1)(* 3(- n 1))))) 
  (define b2 
    (if (= n 1) 0
        (/(* 2 (+ n 3 (expt n 2))) (*(- n 1)(* 9 n)))))
  (define c1 (- b1 (/ 1 a1)))   
  (define c2 (+ (- b2 (/ (+ n 2) (* a1 n))) (/ a2 (expt a1 2))))
  (define e1 (/ c1 a1))
  (define e2 (/ c2 (+ (expt a1 2) a2)))
  (list e1 e2))

【问题讨论】:

  • 这个问题是stackoverflow.com/q/4801595/298282的改写延续
  • 我觉得我在原文中没有正确解释自己。我还发布了我的整个代码(而不是其中的一个 sn-p)来准确展示我正在尝试做的事情。

标签: scheme


【解决方案1】:

函数式编程不同于命令式编程。 Scheme 是一种函数式语言。不要使用绑定变量作为内存位置。但是,如果您需要诸如内存位置之类的东西,请使用向量。

如果您想在另一个函数中使用变量的值,请将其作为参数传递给该函数:

(define (fun1 n) ...)
(define (fun2 n) ...)
(define (fun4 n b) ...)

(define (main n)
  (let ((a1 (fun1 n))
        (b1 (fun2 n)))
    (let ((c1 (fun4 n b1)))
      ( .....)))...))))

【讨论】:

  • 是的,这就是我完成它的方式。我使用了两个单独的辅助函数来获取我的 a1 和 a2。然后我使用一个完全独立的函数来完成其余的工作(在其中调用我的两个辅助函数)。我认为我的错误是试图在每个人中使用定义。尤其是当其中两个函数是递归的时。 Scheme 肯定与 OOP 不同。
【解决方案2】:

使用另一个函数的输出使函数计算结果的惯用方法是组合。在以下示例中,您希望 add2 处理 add1 的结果并通过组合函数来实现:

> (define (add1 n) (+ 1 n))
> (define (add2 n) (+ 2 n))

> (add2 (add1 10))
=> 13

如果你真的想使用全局状态,你可以借助闭包来做到这一点,这样全局命名空间本身就不会被破坏:

(define (make-adder n)
  (lambda (msg)
    (case msg
      ((one) 
       (set! n (+ 1 n)))       
      ((two) 
       (set! n (+ 2 n))))
    n))


> (define adder (make-adder 10))
> (adder 'one)
11
> (adder 'two)
13

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2018-07-03
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多