在全局存储Scheme中的值

时间:2011-01-26 19:33:03

标签: scheme

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

前两个操作是总结。使用n。结果需要存储为变量以便在以后的函数中使用。

离。

main func(n)
       func1 (n)
         returns a1

       func2 (n)
         returns b1

       func4 
         uses b1 to compute c1

       etc....       

我创建了所有单独的函数但需要使用仅接受n的main函数,以及一种全局存储变量以便在以后的函数中使用的方法(不更改它们)。这些是前两个功能。

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

2 个答案:

答案 0 :(得分:1)

功能编程与命令式编程不同。 Scheme是一种功能语言。不要将绑定变量用作内存位置。但是如果你需要像内存位置这样的东西,那就使用vector。

如果你想在另一个函数中使用变量的值,那么将它作为参数传递给该函数:

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

答案 1 :(得分:0)

使用另一个函数的输出来创建函数计算结果的惯用方法是组合。在以下示例中,您希望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