2013-04-22 5 views
2

저는 새로운 디자인의 브랜드입니다. 오늘 밤 내가 파워 포인트 슬라이드가 수업 시간에 나에게 설명했던 것을 제외하고는 처음 만난 적이있다. 필자는 사용자 입력 연산자를 사용하여 그 뒤에 오는 숫자에 대해 해당 연산을 수행하는 체계 프로그램을 작성해야합니다. (즉, 내장 된 '+', '*'등의 연산자를 자체적으로 구현합니다). catch는 재귀를 사용해야한다는 것입니다. 이 스키마 문법을 돌아 다니며 길을 찾으려는 시도는 어디에서 시작해야 할지를 파악하기가 매우 어렵습니다.사용자가 입력 한 반복적으로 정수를 입력하려고합니다.

그래서 나는 적어도 사용자가 입력 한 값을 재귀 적으로 합산하는 코드부터 시작하기로했습니다. 사용자가 연산자와 괄호를 입력하는 것을 걱정하지 않아도됩니다. 나는 그것을 작동시키는 법을 이해할 수 없다. X "는이"내가 지금 재귀를 깰 수있는 방법 의도 된 동일한 경우

(define run (lambda (x) 
(cond 
    ((eqv? x "a") (display x)) 
    (else (+ x (run(read)))) 
))) 

(run (read)) 

조건은 확인 : 여기에 내가 노력하고있어입니다. 최종 버전에서, 입력은 괄호 집합 사이에있을 것이지만, 내가 그 다리에 올 때 나는 그 다리를 건너려고한다고 생각했습니다. 어쨌든, 코드는 입력을 받아들이지 만 멈추지 않습니다. 따라서, x를 표시하는 조건은 절대로 호출되지 않습니다. 나는 아마 모든 것을 잘못하고 있음을 알고 있으며, 나는 정말로 약간의 조언에 감사 할 것입니다.

편집 : 좋아, 나는 적어도 뭔가 이해가되지 않는다는 것을 깨닫기 시작했다. x를 어떤 식 으로든 저장하지 않기 때문에 실제로 x를 표시하는 것은 합계를 제공하지 않습니다. 그러나 문자를 입력 할 때 코드가 적어도 멈추지 않는 이유는 아직도 이해할 수 없습니다.

EDIT 2 : 조건이 1 일 때만 작동합니다. 어떻게 재귀를 끝내기 위해 char 또는 더 나은 아직 괄호의 입력을 인식하도록 할 수 있습니까? 1처럼? :

(define run (lambda (x) 
(cond 
    ((eq? x 1) 0) 
(else (+ x (run(read)))) 
))) 

(run (read)) 

답변

1

EOF (End Of File)는 입력의 끝을 표시합니다. Scheme에는 이에 대한 절차가 eof-object? 있습니다. 귀하의 코드는 기본적으로 정확합니다 :

(define (run x) 
    (if (eof-object? x) 
     0 
     (+ x (run (read))))) 

Control-D을 사용하여 실행을 종료하십시오. 어떤 이유로 든 eof-object?에 액세스 할 수 없으면 X과 같은 특수 문자를 사용하십시오. 이 경우 테스트는 (eq? x #\X)

0
(define (addition-loop) 
(let ((answer (read))) 
     (if (number? answer) 
      (+ answer (addition-loop)) 
      0))) 

이 바로이 숫자가 아닌 뭔가를 입력 할 중단됩니다 것입니다.

또한 알 수 있듯이 인수가 0 인 함수를 사용할 수 있습니다.

어쨌든 코드에 문제가있는 경우, 실제로는 'a'가 아니라 'a'또는 (quote a)와 같은 가치가 있습니다.

(eqv? 'a "a") 

;Value: #f 
관련 문제