2012-06-15 2 views
3

나는 scheme을 처음 사용하고 있습니다. 이것은 MIT의 SICP 과정의 코드 샘플입니다.이 Scheme 코드를 라켓으로 변환하는 방법

(define (+ x y) 
    (if (= x 0) 
     y 
     (+ (-1+ x) (1+ y)))) 

어떻게 이것을 라켓 코드로 변환합니까? DrRacket을 코드 실행에 사용하고 있기 때문에 라켓으로 변환하고 싶습니다. 그것은 지금까지는 작동했지만 구성표의 증가 연산자에 대해 불평했다. 내가 할

오류는 다음과 같습니다

http://www.youtube.com/watch?v=dlbMuv-jix8&t=1325

+0

을 쓸 수 있습니까? '# lang' 기반 언어 (예를 들어,'#lang racket')를 사용하면, 언어에서 나온'+'와 같은 프리미티브를 재정의 할 수 있습니다. 학생용 언어를 사용하는 경우 더 나은 오류보고를 제공하기 위해 귀하를 제한 할 것입니다. –

+0

이전에는 학생용 언어와 R5RS를 사용했습니다. '#lang scheme '지시어를 추가 했으므로'Check Syntax '를 클릭하면 더 이상 첫 번째 오류가 발생하지 않습니다. 하지만 실행할 때'(+ 2 3)'나는 오류 다음 얻을 : ".. 평가 스레드가 더 이상 실행되지, 그래서 평가는 다음 실행 때까지 실행할 수 없습니다 이 프로그램은 메모리가 부족합니다" 내부 '+'와 충돌 할 수 있습니다. 댓글 : DrRacket 5.2.1을 사용하고 있습니다. 내 파일 이름은 peano3입니다.rkt와 나는 "소스로부터 언어 결정"설정을 가지고있다. – ikhthiandor

+0

"#lang scheme"은 오래된 하위 호환 언어입니다. 아마도'#lang racket'을 사용하기를 원할 것입니다. 메모리 부족을 너무 낮게 설정했거나 프로그램에 버그 (예 : 무한 루프)가있어이 오류가 발생했기 때문입니다. –

답변

12

이가 라켓에 잘 작동합니다 :

(define (add x y) 
    (if (= x 0) 
     y 
     (add (sub1 x) (add1 y)))) 

일부 의견 :

  • 이름이 + 인 경우 문제가 될 수 있습니다. 위와 충돌하기 때문에 th에서 Scheme의 프리미티브 가산 연산; add과 같은 다른 이름을 사용하면 더 간단합니다 (첫 번째 오류가 수정 됨)
  • -1+은 Racket의 절차가 아니므로 sub1으로 바꿉니다 (두 번째 오류가 수정 됨). 선택적으로이 프로 시저의 별칭을 다음과 같이 정의 할 수 있습니다. (define -1+ sub1)
  • 1+은 Racket의 프로 시저가 아니므로 add1으로 바꿉니다. 선택 사항으로,이 같은,이 절차에 대한 별명을 정의 할 수 있습니다 : (define 1+ add1)
  • 선택적 : 대신 (= x 0)의 당신은 당신이 DrRacket에서 사용하는 언어는 무엇 (zero? x)
+1

Lopez 고마워, 그게 효과가있어. – ikhthiandor

+0

당신은 당신 자신의 모듈에서 당신 자신의 정의를 얻는다는 것을 의미 할 수있다. –

+0

@ ElBarzilay 동의, 내 대답을 바꿔. 그것은 당신이 아니기 때문에 불편할뿐입니다. –

2

해결하려면 :

  1. define-values: cannot change constant variable: +
  2. 여기 reference to undefined identifier: -1+

내가로부터 배우고 비디오에 대한 링크입니다 두 번째 오류, 찬 ge (-1+ x) ~ (- x 1)(1+ y) ~ (+ y 1). This answer은 첫 번째 오류에 도움이됩니다. 당신이 -1+1+를 사용하려면

, 당신은 그들에게 자신을 정의 할 수 있습니다

(define (1+ x) (+ x 1)) 
(define (-1+ x) (- x 1)) 
+0

-1 + 및 1+에 대한 프로 시저를 정의했지만 '+'식별자를 재정의 할 필요가 없습니다. 나는 주변에서 일했다 (추가 정의). DrRacket의 기본 설정을 살펴 보았지만 식별자 나 프로 시저의 재정의를 허용하지 않았습니다. – ikhthiandor

+0

오늘 집에 올 때 알아낼 수 있는지 알 겠어. – benekastah

+0

확인. 시간을내어 도와 주셔서 감사합니다 :) – ikhthiandor

관련 문제