牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

SICP 1.3.2 Constructing Procedures Using LambdaをPythonでやってみた

SICPの1.3.2 Constructing Procedures Using LambdaあたりをPythonでやってみた

scheme
(define (square x)(* x x))
;a
(define (f x y)
  (define (f-helper a b)
    (+ (* x (square a))
       (* y b)
       (* a b)))
  (f-helper (+ 1 (* x y)) 
            (- 1 y)))
(f 1 4) ;4
;b
(define (f x y)
  ((lambda (a b)
     (+ (* x (square a))
        (* y b)
        (* a b)))
   (+ 1 (* x y))
   (- 1 y)))
(f 1 2) ;4
;c
(define (f x y)
  (let ((a (+ 1 (* x y)))
        (b (- 1 y)))
    (+ (* x (square a))
       (* y b)
       (* a b))))
(f 1 2) ;4
;d
(define (f x y)
  (define a (+ 1 (* x y)))
  (define b (- 1 y))
  (+ (* x (square a))
     (* y b)
     (* a b)))
(f 1 2) ;4
python
#a
def f_a(x,y):
    def f_helper(a,b):
        return (x * (a ** 2)) + (y * b) + (a * b)
    return f_helper((1 + x * y), (1 - y))
print f_a(1,2) #4
#b
def f_b(x,y):
    la_helper = lambda a,b:(x * (a ** 2)) + (y * b) + (a * b)
    return la_helper((1 + x * y), (1 - y))
print f_b(1,2) #4
#c
def f_c(x,y):                   # pythonでletの代用って?
    a = 1 + x * y
    b = 1 - y
    return (x * (a ** 2)) + (y * b) + (a * b)
print f_c(1,2) #4
#d
def f_d(x,y):
    def a():
        return 1 + x * y
    def b():
        return 1 - y
    a = a()
    b = b()
    return (x * (a ** 2)) + (y * b) + (a * b)
print f_d(1,2) #4