What have you found for these years?

2009-03-15

印星星 (2)

...頭一次碰到有人來踢館,還溝通不能,真無趣。
害我多浪費了不少時間在這上面。
算了,情緒性的話多說無益,反正不過是兩個,與無數多個世界的人罷了。

下午持續在試用 OCaml, 不過發覺 OCaml 實在是...
首先是找不到 list comprehension, 然後發現使用
Camlp4ListComprehension 似乎是可以用,但是...
好像只有在 interactive mode 下比較容易使用罷了。
似乎沒辦法直接 $ ocaml Star.ml 就能使用?

乾脆放棄 list comprehension, 反正也不是一定要用。
但是記得之前好像就查過,也沒有產生 range list 的 short hand 吶。
然後搞半天才發覺 let 只能有一個 expression, 所以必須一直
let ... in let ... in let ... in ......... orz

把數字轉成字串用 string_of_int ... 好長的名字 :s
print 也是一堆 print_xxx ... 連要測試都很困難。
最後 fold_right 的 type 一直不對,搞不懂為什麼,
查半天,翻半天,才發覺 fold_right 的最後兩個
parameter 跟 fold_left 居然是反過來的 @@

頭一次看到 foldl 和 foldr 是這樣反過來的 @@
所以一直沒想到會是個問題... 只覺得很詭異 type 怎麼一直錯?
錯誤訊息也沒提供多少訊息,很多地方都看不太懂。

ocaml byebye...

(* Star.ml *)
(*
#load "dynlink.cma";;
#load "camlp4/camlp4o.cma";;
#load "camlp4/Camlp4Parsers/Camlp4ListComprehension.cmo";;
*)

let rec range i j = if i > j then [] else i :: range (i+1) j;;

let star max =
let mid = max / 2 + 1 in
let spaces i = List.map (fun x -> " ") (range 0 (abs (mid-i-1) - 1)) in
let row n = List.map string_of_int
(range mid (( max+mid-2 * abs (mid-n-1) ) - 1)) in

let rectangle = List.map (fun i -> List.append (spaces i) (row i))
(range 0 (max-1)) in

let to_s = List.fold_right (fun l s -> "\n" ^ String.concat "" l ^ s) in
let result = to_s rectangle "" in
String.sub result 1 (String.length result - 1);;

print_string ((star 5) ^ "\n");;

All texts are licensed under CC Attribution 3.0