2017-02-04 9 views
1

장 19얻을 - 첫번째 - 더 - 양념 - 음모하는

내 질문은 get-first 도우미 함수의 (leave '())에 관한에서 two-in-a-row*? 기능에서 봐 주시기 바랍니다. (waddle l)'() 또는 목록이 모두 소모되었거나 목록의 아톰이 검색되었음을 나타내는 원자를 반환합니다.

(leave '())이 없으면이 두 종류의 값이 반환되고 계속되는 leave은 사용되지 않습니다. 그러나이 책은 (leave '())이 없으면 나쁘다고 말합니다.

대단히 감사합니다.

또 다른 흥미로운 tread입니다.

+0

안녕하세요, SO에 대한 질문은 실제로 자급 자족해야합니다. 적어도이 기능이 무엇을해야하는지 설명해야합니다. 샘플 입력에 대한 예상 출력을 표시 할 수 있습니다. –

답변

1

그래서 윌 네스의 예를 주셔서 감사합니다. 나는 심지어 더 단순한 것들을 조사했다. 그래서 "그게 뭐 그리 나쁘니?" - (leave '())없이 get-first에.

짧은 답변 : 우리가 get-first 또는 get-next를 호출 할 때 내 코드
I)에서 leave 항상마다 다시됩니다

참고. get-first 또는 get-next 중 하나로 돌아갑니다.
ii) fill은 이전 fill에 따라 체인이되며 항상 get-first으로 돌아갑니다.


입력 :

'(1) 그래서 우리가 '(1)get-first을 평가하여 시작합니다.
제가 ) leave
는 ⅱ) 1는 원자 때문에 (waddle '(1)
는 ⅲ) 때문에 전류 연속으로 fill 설정 시작 설정. 우리가 fill을 사용한다면, (waddle (cdr l))을 수행하고 을 입력하면 get-first으로 돌아갑니다. iv) leave 및 반환 값 1을 사용하여 get-first으로 돌아갑니다.

그런 다음 우리는 (T? 1)으로 가서 get-next을 실행합니다.
난) leave
는 ⅱ) fill
는 ⅲ) (waddle '())
는 IV) 다음 get-first로 돌아가 waddle에서 ()를 반환 시작 실행 설정. 우리가 (leave '()이없는 경우


1), 다음 get-first'()를 반환합니다, 다음 two-in-a-row* 반환 #f. 그래서 우리는 똑같은 대답을 얻을 수 있지만 그 행동은 우리가 원하는 것이 아닙니다.
2) leaveget-next으로 생성 된 leave이므로 '()get-next으로 전송할 예정입니다.
3) fill을 생성 할 때 목록에 입력이 두 개 이상일 경우 이전 fill을 기반으로 만들어 지므로 결과는 fill에 따라 달라집니다.

0

이름이 밝혀졌습니다. 나는 "휴가"에 "수확량"을, "채우기"에는 "다음"을 사용했습니다. 또한 atom?을 정의하고 letcccall/cc으로 다시 써야만 Racket에서 작동합니다. 여기에 전체 코드는 다음과 같습니다

(define two-in-a-row* 
    (letrec ([yield '()] 
      [next '()] 
      [atom? (lambda (x) (and (not (null? x)) 
            (not (pair? x))))] 
      [waddle (lambda (l) 
        (cond [(null? l) '()] 
          [(atom? (car l)) 
          (begin 
           (call/cc (lambda (here2) 
              (set! next here2) 
              (yield (car l)))) 
           (waddle (cdr l)))] 
          [else 
          (begin (waddle (car l)) 
            (waddle (cdr l)))]))] 
      [get-first (lambda (l) 
         (call/cc (lambda (here1) 
            (set! yield here1) 
            (waddle l) 
            (yield '()) ; why is this part needed??? 
            )))] 
      [get-next (lambda() 
         (call/cc (lambda (here3) 
            (set! yield here3) 
            (next 'dummy))))] 
      [T? (lambda (a) 
       (let ([n (get-next)]) (display (list "next:" n)) 
        (and (atom? n) 
         (or (eq? a n) 
          (T? n)))))]) 
    (lambda (l) 
     (let ([a (get-first l)]) 
     (and (begin      (display (list "first:" a)) 
        (atom? a)) 
      (T? a)))))) 

우리는 여기의 차이를 볼 수 있습니다

(two-in-a-row* '(((7) (b)) c (d))) 
    ; w/out yield() : (first: 7)(next: b)(next: c)(next: d)(first:())#f 
    ; w/ yield() : (first: 7)(next: b)(next: c)(next: d)(next:())#f 
    ; w/ yield #f : (first: 7)(next: b)(next: c)(next: d)(next: #f)(next: #f)#t 

(two-in-a-row* '(((7) (b)) c())) 
    ; w/out yield() : (first: 7)(next: b)(next: c)(first:())#f 
    ; w/ yield() : (first: 7)(next: b)(next: c)(next:())#f 
    ; w/ yield #f : (first: 7)(next: b)(next: c)(next: #f)(next: #f)#t 

(two-in-a-row* '(((7) (b)) b())) 
    ; w/out yield() : (first: 7)(next: b)(next: b)#t 
    ; w/ yield() : (first: 7)(next: b)(next: b)#t 
    ; w/ yield #f : (first: 7)(next: b)(next: b)#t 
+0

안녕하세요 @ 윌 네스, 그레이트 !!! 나는 그것이 정확히 어떻게 작동하는지 이제 이해한다. 나는 당신에게 이것에 대한 크레딧을 줄 것입니다. 나는 모든 것을 다른 대답으로 쓸 것이다. – Ling

+0

@ 링 시아 어 어떻게 든 당신을 도왔습니다. 이 하나가 진짜 마음을 굽히는 사람입니다. :) –