parent
4200c6708e
commit
cdec813b24
|
|
@ -0,0 +1,98 @@
|
|||
| JoyInt i -> string_of_int i
|
||||
| JoyList el -> "[" ^ ^ "]"
|
||||
Secret happy robot^
|
||||
|
||||
|
||||
let lex = Genlex.make_lexer ["["; "]"];;
|
||||
let s = Stream.of_string "1[2]3";;
|
||||
let t = lex s;;
|
||||
|
||||
val t : Genlex.token Stream.t = <abstr>
|
||||
Stream.next t;;
|
||||
|
||||
Genlex.token = Genlex.Int 1
|
||||
Genlex.token = Genlex.Kwd "["
|
||||
|
||||
|
||||
|
||||
let rec parse_one : token list -> joy_type * token list = fun tokens ->
|
||||
match tokens with
|
||||
| [] -> raise (ParseError "Empty list.")
|
||||
| head :: tail ->
|
||||
match head with
|
||||
| Left_bracket -> parse_list tail []
|
||||
| Right_bracket -> raise (ParseError "Extra closing bracket.")
|
||||
| Token tok ->
|
||||
match tok with
|
||||
| "true" -> (joy_true, tail)
|
||||
| "false"-> (joy_false, tail)
|
||||
| _ -> (JoySymbol tok, tail)
|
||||
|
||||
and parse_list : token list -> joy_list -> joy_type * token list = fun tokens acc ->
|
||||
(* collect terms until ']' *)
|
||||
match tokens with
|
||||
| [] -> raise (ParseError "Missing closing bracket.")
|
||||
| _ -> let item, rest = parse_one tokens in
|
||||
JoyList (item :: acc), parse_list rest acc
|
||||
|
||||
match head with
|
||||
| Left_bracket -> parse_list tail []
|
||||
| Right_bracket -> raise (ParseError "Extra closing bracket.")
|
||||
| Token tok ->
|
||||
|
||||
|
||||
|
||||
|
||||
let foo n = n + 1
|
||||
|
||||
(* parameterize foo and you have map *)
|
||||
|
||||
let rec poo tokens acc =
|
||||
match tokens with
|
||||
| [] -> acc
|
||||
| head :: tail ->
|
||||
let item = foo head in
|
||||
item :: poo tail acc
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
(* Let's generalize foo to get and return tails *)
|
||||
|
||||
|
||||
let bar n = n + 1
|
||||
let baz tail = tail
|
||||
|
||||
let foo head tail =
|
||||
bar head, baz tail
|
||||
|
||||
let rec poo tokens acc =
|
||||
match tokens with
|
||||
| [] -> acc
|
||||
| head :: tail ->
|
||||
let item, rest = foo head tail in
|
||||
item :: poo rest acc
|
||||
.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* for Vim, add this line to ~/.vimrc:
|
||||
set rtp^="/usr/home/sforman/.opam/default/share/ocp-indent/vim"
|
||||
|
||||
|
||||
<><> merlin.4.6-414 installed successfully ><><><><><><><><><><><><><><><><><><>
|
||||
=> merlin installed.
|
||||
|
||||
Quick setup for VIM
|
||||
-------------------
|
||||
Append this to your .vimrc to add merlin to vim's runtime-path:
|
||||
let g:opamshare = substitute(system('opam var share'),'\n$','','''')
|
||||
execute "set rtp+=" . g:opamshare . "/merlin/vim"
|
||||
|
||||
Also run the following line in vim to index the documentation:
|
||||
:execute "helptags " . g:opamshare . "/merlin/vim/doc"
|
||||
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
|
||||
def f(string, start=0, acc=[]):
|
||||
if start >= len(string):
|
||||
return acc
|
||||
if '[' == string[start]:
|
||||
return [1] + f(string, start+1, acc)
|
||||
if ']' == string[start]:
|
||||
return [0] + f(string, start+1, acc)
|
||||
if ' ' == string[start]:
|
||||
return f(string, start+1, acc)
|
||||
symbol, n = bar(string, start, start)
|
||||
return [symbol] + f(string, n, acc)
|
||||
|
||||
|
||||
def bar(string, start, end):
|
||||
if end >= len(string) or string[end] in '[] ':
|
||||
return string[start:end], end
|
||||
return bar(string, start, end+1)
|
||||
|
||||
|
||||
print(f("1[2[] 3]4"))
|
||||
Loading…
Reference in New Issue