Shammer's Philosophy

My private adversaria

関数型変数を使用して入力値の型を変更する

コマンドラインからの入力で、ある値は文字列として扱い、ある値は数値として扱い、というようにするには、Java ではできなかった。できなかったというか、一旦は全て文字列で受取り、その文字列を後で数にしたりといった手順を踏む必要があった。Lisp だと関数を引数で渡すことができるので、こういうときに便利だ。

? (defun prompt-read (prompt fn)
    (format *query-io* "~a: " prompt)
    (force-output *query-io*)
    (funcall fn *query-io*))
PROMPT-READ
? (prompt-read "What your name?" #'read-line)
What your name?: Taro
"Taro"
NIL
? (prompt-read "How old are you?" #'read)
How old are you?: 100
100
? 

関数を引数で渡すことができない場合は、ほとんど似たような処理のメソッドや関数を二つ用意しないといけない。Java だとこんなだろうか。

public String prompt-string(String prompt){
  System.out.println(prompt);
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String v = br.readline();
  return v;
}

public int prompt-integer(String prompt){
  System.out.println(prompt);
  BufferedReader br = new BufferReader(new InputStreamReader(System.in));
  String v = br.readline();
  Integer.parseInt(v);// NumberFormatException のチェック処理は省略
}