zoukankan      html  css  js  c++  java
  • SICP_3.7-3.8

    第一次写的:

     1 ;(define (make-account balance secret-password-list)
     2 
     3 ;        (define (withdraw amount)
     4 ;        (if (>= balance amount)
     5 ;            (begin (set! balance (- balance amount))
     6 ;                  balance)
     7 ;            "Insufficient funds"))
     8 ;
     9 ;             (define (deposit amount)
    10 ;               (set! balance (+ balance amount))
    11 ;               balance)
    12 ;
    13 ;             (define (dispatch m)
    14 ;               (cond
    15 ;                     ((eq? m 'withdraw) withdraw)
    16 ;                     ((eq? m 'deposit) deposit)
    17 ;                     (else (error "Unknow request -- MAKE-ACCOUNT"
    18 ;                                  m))))
    19 ;  (lambda (p m)
    20 ;    (if (in? p secret-password-list) (dispatch m)
    21 ;        (lambda (x) "Incorrect password"))))
    22 
    23 
    24 ;(define in?
    25 ;  (lambda (x list)
    26 ;    (cond ((null? list) #f)
    27 ;          ((eq? x (car list)) #t)
    28 ;          (else (in? x (cdr list))))))
    29 
    30 ;(define (make-joint account old-pa new-pa)
    31 ;  (set! account (make-account ((account (car old-pa) 'withdraw) 0)
    32 ;                              (cons new-pa old-pa))))

    我尝试用建立列表的方法来做,但是这就导致了不同的账户可以用不同的密码来操作。

    同时我写的这个过程还有bug,我用set!去 把一个新过程赋给一个旧过程,但是结果

    上,Paul 可以通过 Peter 的密码来操作账户,Peter可以用Paul的来操作。可是,这两个

    账户却是独立的,并没有关联起来,Paul对账户的操作,不会影响Peter账户,反之亦然。

    所以set!到底做了什么,会出现这种情况?

    思路相同的答案

    换一个思路后:

     1 (define (make-account balance secret-password)
     2 
     3         (define (withdraw amount)
     4         (if (>= balance amount)
     5             (begin (set! balance (- balance amount))
     6                    balance)
     7             "Insufficient funds"))
     8 
     9              (define (deposit amount)
    10                (set! balance (+ balance amount))
    11                balance)
    12 
    13              (define (dispatch m)
    14                (cond
    15                      ((eq? m 'withdraw) withdraw)
    16                      ((eq? m 'deposit) deposit)
    17                      (else (error "Unknow request -- MAKE-ACCOUNT"
    18                                   m))))
    19   (lambda (p m)
    20     (if (eq? p secret-password) (dispatch m)
    21         (lambda (x) "Incorrect password"))))
    22 
    23 
    24 (define (make-joint account old-password new-password)
    25   (lambda (password mode)
    26     (if (eq? password new-password)
    27         (account old-password mode)
    28         "Incorrect password")))
    29 
    30 (define peter-acc (make-account 100 'open-sesame))
    31 
    32 (define paul-acc
    33   (make-joint peter-acc 'open-sesame 'rosebud))
    34 
    35 ((paul-acc 'rosebud 'withdraw) 10)
    36 ((peter-acc 'open-sesame 'withdraw) 20)
    37 ((paul-acc 'rosebud 'deposit) 10)
    38 ((peter-acc 'rosehud 'deposit) 10)

    这个是在make-joint 过程中对密码进行判断,如果给的密码和新密码相同就通过旧密码去访问账户

    不同的账户只能通过,自己的密码来访问账户

    3.8:

     1 (define f
     2   (let ((called #f))
     3     (lambda (x)
     4       (if called
     5           0
     6           (begin (set! called #t)
     7           x)))))
     8 
     9 (+ (f 1) (f 0))
    10 (+ (f 0) (f 1))
    Yosoro
  • 相关阅读:
    Vue3.0实战项目
    Vue 笔试题(做对九题即可成为前端懂王)
    CSS 响应式布局---Grid 布局
    CSS快速提升技巧(一)
    前端骨架屏
    Python学习29
    Python学习28
    Python学习27
    Python学习26
    Python学习25
  • 原文地址:https://www.cnblogs.com/tclan126/p/6534364.html
Copyright © 2011-2022 走看看