2011-06-12 3 views
0

나는 newby입니다. 아래 코드를 작성합니다.구문 오류, 코드 오류를 확인하는 방법은 무엇입니까?

Delay(e) == fn() => e 
Force(e) == e() 

fun time_consuming(n) = 
    let fun tak(x, y, z) = if x <= y then y 
       else tak(tak(x-1,y,z), tak(y-1,z,x), tak(z-1,x,y)) 
    in   
fun tak(3*n, 2*n, n) 
funend; 
fun fib(n) = if n=0 orelse n=1 then 1 else fib(n-1) + fib(n-2); 
fun odd(n) = (n mod 2) = 1; 
fun f(x, y) = if odd(x) then 1 else fib(y); 
f(fib(9), time_consuming(9)); 

fun lazy_f(x, y) = if odd(x) then 1 else fib(y()); 
lazy_f(fib(9), fn() => (time_consuming(9))); 

게으른 평가 코드입니다.
하지만 약간의 오류가 있습니다.

lazy.sml:1.13 Error: syntax error: inserting LPAREN
lazy.sml:4.2 Error: syntax error: inserting LET
lazy.sml:12.44 Error: syntax error: replacing SEMICOLON with EQUALOP
lazy.sml:15.21 Error: syntax error: inserting LPAREN
lazy.sml:17.1 Error: syntax error found at EOF

이러한 오류의 의미는?

답변

4

SML에서 오류가 종종 연쇄 적으로 발생합니다. 즉, 하나의 오류로 인해 오류가 발생한 후에 오류가 발생할 수 있습니다. 따라서 좋은 방법은 첫 번째 오류 만보고 수정하고 코드를 다시 시도하는 것입니다.

우리가 첫 번째 오류 보면 :

lazy.sml:1.13 Error: syntax error: inserting LPAREN 

, 우리는 그것이 첫 번째 줄에 의해 발생되는 것을 볼 수 있습니다. 우리가 그것을 보면, 이것이 sml에 의해 해석되는 방법입니다; Delay 함수를 취하여 e를 인자로 보내고 결과로 새로운 함수를 얻습니다. 이 함수를 인수로 ==를 인수로 보내고 람다 함수 fn() => e이 전달되는 또 다른 함수를 얻습니다. 그러나 SML 구문은 람다 함수를 인수로 전달하기 위해 괄호로 묶어야하므로 "LPAREN 삽입"으로 작성된 왼쪽 괄호가없는 경우 오류가 발생합니다.

그러나 처음 두 줄의 목적은 코드의 나머지 부분과 관련이 없으므로 나에게는 맞지 않으며 구문에서도 거의 정확하므로 이제는 간단히 주석을 달아 볼 것입니다 (" . (* '와'*) "

새로운 코드를 실행하고 새로운 오류의 첫 번째 볼 수 있습니다 : 이제 우리는 여덟 번째 라인에 관심을 돌려, 볼

lazy.sml:7.4-8.4 Error: syntax error: deleting IN FUN 

그것은 그와 9 번째 줄에는 실수로 "재미"가 붙습니다. 8 번째 줄과 9 번째 줄의 "재미"를 공백으로 바꾸어 다시 실행합니다.

이제 작동합니다! 이 작업 코드입니다 : 당신이 볼 수있는 것처럼, 실수보다 더 많은 오류가 있었다

(* Delay(e) == fn() => e *) 
(* Force(e) == e() *) 

fun time_consuming(n) = 
    let fun tak(x, y, z) = if x <= y then y 
       else tak(tak(x-1,y,z), tak(y-1,z,x), tak(z-1,x,y)) 
    in   
     tak(3*n, 2*n, n) 
    end; 
fun fib(n) = if n=0 orelse n=1 then 1 else fib(n-1) + fib(n-2); 
fun odd(n) = (n mod 2) = 1; 
fun f(x, y) = if odd(x) then 1 else fib(y); 
f(fib(9), time_consuming(9)); 

fun lazy_f(x, y) = if odd(x) then 1 else fib(y()); 
lazy_f(fib(9), fn() => (time_consuming(9))); 

, 그리고 당신이 오류 메시지의 의미를 디코딩하는 것은 필요하지 않고, 단순히 위치에서보고 배운 것을 희망한다 첫 번째 오류의 내용은 무엇이 잘못되었는지를 깨닫기에 충분합니다.