2012-07-26 7 views
0

ocaml에서 stdinput을 통해 전달되는 파일에서 char을 읽으려고합니다. 나는 내가 다음 코드에서받는 char를 print_char 할 수있을 때 왜 유닛을 계속 가져야하는지 궁금해했다. 또한, 나는 지금 일하지 않을이 특성의 명부를 만드는 것을 시도하고있다.ocaml input_char

let() = 
let charList = [] in 
let inchar = open_in Sys.argv.(1) in 
    try 
      while true do 
       let c = Char.uppercase(input_char inchar) in 
        print_char c; print_int (List.length charList);c::charList 
      done 
    with End_of_file -> close_in inchar;(*; print_int (List.length charList); printTest charList;*) 

;

답변

5

코드는 을 수정하지 않으므로 은 전체 실행 중에 빈 목록으로 남습니다.

let charList = []을 정의하면 은 변경 불가능합니다.

이러한 라인을 따라 뭔가를 시도 할 수 있습니다 :

let() = 
    let charList = ref [] in 
    let inchar = open_in Sys.argv.(1) in 
    try 
    while true do 
     let c = Char.uppercase (input_char inchar) in 
      charList := c :: !charList 
    done 
    with End_of_file -> 
     charList := List.rev !charList; 
     close_in inchar; 
     print_int (List.length !charList); 
     List.iter print_char !charList 

좀 더 의견 :

+0

. 도와 주셔서 감사 드리며 올바른 길을 택한 것을 알게되었습니다. – Rob

1

처럼 당신은 더 많은 기능 무언가를 시도해야합니다 :

내가하고 결국 어떻게 든이 게시물 전에 해낸 실제로
let rec read inchar char_list = 
    try 
    read inchar ((Char.uppercase (input_char inchar))::char_list) 
    with End_of_file -> char_list 

let() = 
    let inchar = open_in Sys.argv.(1) in 
    let char_list = read inchar [] in 
    close_in inchar 
+0

스택 오버플로에 대한 해답 : try-with로 인해 꼬리 호출이 최적화되지 않습니다. "read"에 대한 재귀 호출은 마지막 일이 아니며 이후에 발생할 수 있습니다. 'inchar_opt c = end_of_file -> None'을 사용하여 일부 input_char c를 시도하고 읽기에서 Some | None과 일치하는 inchar-wrapper를 만들면이 문제를 피할 수 있습니다. – unhammer

+0

그리고 (적어도 최근 ocaml?에서) 이제는 File.with_file_in을 할 수 있습니다. 그러면 당신을 위해 채널을 닫습니다. – unhammer