flux changed the topic of #ocaml to: Discussions about the OCaml programming language | http://caml.inria.fr/ | OCaml 4.00.1 http://bit.ly/UHeZyT | http://www.ocaml.org | Public logs at http://tunes.org/~nef/logs/ocaml/
osnr has quit [Quit: Leaving.]
<mrvn> reasonally?
<mrvn> ups, n8.
osnr has joined #ocaml
osnr has quit [Changing host]
osnr has joined #ocaml
ben_zen has quit [Ping timeout: 248 seconds]
ben_zen has joined #ocaml
watermind has joined #ocaml
introom has joined #ocaml
osnr has quit [Quit: Leaving.]
csakatoku has joined #ocaml
introom has quit [Remote host closed the connection]
introom has joined #ocaml
introom has quit [Ping timeout: 256 seconds]
madroach has quit [Ping timeout: 248 seconds]
madroach has joined #ocaml
ollehar has joined #ocaml
darkf has joined #ocaml
q66 has quit [Quit: Leaving]
pkrnj has joined #ocaml
watermind has quit [Quit: Konversation terminated!]
gnuvince has joined #ocaml
ygrek has joined #ocaml
gnuvince has quit [Changing host]
gnuvince has joined #ocaml
watermind has joined #ocaml
ollehar has quit [Read error: Operation timed out]
rwmjones has quit [Read error: Operation timed out]
ben_zen has quit [Quit: leaving]
rwmjones has joined #ocaml
ben_zen has joined #ocaml
pkrnj has quit [Quit: Computer has gone to sleep.]
shinnya_ has quit [Ping timeout: 245 seconds]
introom has joined #ocaml
pkrnj has joined #ocaml
pkrnj has quit [Quit: Computer has gone to sleep.]
watermind has quit [Quit: Konversation terminated!]
Drup has quit [Quit: Leaving.]
pkrnj has joined #ocaml
bzzbzz has joined #ocaml
darkf_ has joined #ocaml
orbitz_ has joined #ocaml
pkrnj has quit [*.net *.split]
pkrnj has joined #ocaml
darkf has quit [*.net *.split]
csakatoku has quit [*.net *.split]
orbitz has quit [*.net *.split]
csakatoku has joined #ocaml
darkf_ is now known as darkf
<zRecursive> why cannot "truncate 2.1;;" ?
<zRecursive> Error: This expression has type float but an expression was expected of type string
<gasche> you added " in the wrong place; please show the exact input you sent to the toplevel or program
<zRecursive> #truncate 2.1;;
<gasche> it works on my machine; did you redefine truncate?
<zRecursive> no, it is ocaml 3.12
weie_ has joined #ocaml
weie has quit [Ping timeout: 256 seconds]
xaimus has quit [Quit: leaving]
xaimus has joined #ocaml
bzzbzz has quit [Quit: leaving]
pkrnjevic has joined #ocaml
pkrnj has quit [Ping timeout: 264 seconds]
pkrnjevic is now known as pkrnj
<zRecursive> #truncate;;
<zRecursive> - : string -> int -> unit = <fun>
<gasche> zRecursive: on OCaml 3.12.1, "truncate : float -> int"
<gasche> you must have redefined truncate
<gasche> either yourself, or by opening a module that exports another truncate
<gasche> try
<gasche> Pervasives.truncate;;
<zRecursive> gasche: thx, how to find the redefined truncate ?
<zRecursive> truncate "2.1" 2;;
<zRecursive> Exception: Unix.Unix_error (ENOENT, "truncate", "2.1").
pkrnj has quit [Quit: Computer has gone to sleep.]
cdidd has quit [Remote host closed the connection]
cdidd has joined #ocaml
pkrnj has joined #ocaml
ggole has joined #ocaml
pkrnj has quit [Client Quit]
osnr has joined #ocaml
osnr has quit [Changing host]
osnr has joined #ocaml
orbitz_ has quit [Quit: Reconnecting]
orbitz has joined #ocaml
Neros has joined #ocaml
ygrek has quit [Ping timeout: 256 seconds]
<adrien_> zRecursive: you've "open Unix;;"
<adrien_> so Unix.truncate became reachable as "truncate"
<adrien_> and that shadowed the previous definition
<adrien_> (whihc is still reachable through Pervasives.truncate)
<adrien_> and that's the reason we avoid truncate and instead:
<adrien_> let open module Unix in ...
<adrien_> let module U = Unix in U.truncate ...
<adrien_> (that's for local definitions)
<adrien_> module U = Unix (that's for a toplevel definition)
csakatok_ has joined #ocaml
csakatoku has quit [Ping timeout: 256 seconds]
osnr has quit [Quit: Leaving.]
<zRecursive> adrien_: VERY clear, thx
<adrien_> forgot one: Unix.(truncate pipe listen) : Unix is "open" inside the ()
<orbitz> Do tockenizers usually turn a string into a sequence of strings, or d othey apply semantics too, like '(' -> Left_paren ?
<orbitz> foo -> Variable
<whitequark> orbitz: the latter
<orbitz> so would Foo become an Identifeir or something? I presume the tokenizer cannot deferentieate a constructor from a module
ben_zen has quit [Quit: leaving]
<whitequark> orbitz: yes
<whitequark> ([A-Z] [A-Za-z_]*) as ident -> Identifier ident
<orbitz> swell
<orbitz> Are string literals generally represetned without their surrounding ""?
<whitequark> yes, and without escape sequences as well
<whitequark> you'd want to be as close to abstract syntax as it's rational. simplifies parser's job
<orbitz> ok
<orbitz> is tokenizing the same as lexing, or is lexing taking tokens and converting to an AST?
<whitequark> same
<whitequark> well, tokenizer is a more abstract machine than a lexer, I think, but in this context it's the same
<flux> taking tokens and creating an ast is called parsing
<whitequark> (you don't necessarily have to turn text into tokens, and if it isn't text, the process wouldn't be "lexical" analysis)
<whitequark> and what flux says
<orbitz> Okay, and what is considered the state of teh art on tokenizing these days? My own function?
<flux> (hence 'parser generators' such as yacc/bison (and ocamlyacc))
<flux> I usually use lexer generators such as ocamllex, unless it's something very small
<whitequark> orbitz: ulex
<flux> (but it's pretty easy to use a lexer generator even in small cases, once you know how)
<orbitz> I'm parsing a pretty small language. atoms, tuples, string literals, lists, and numbers
<orbitz> flux: for small things what do you use? i was thinking of writing the tokenizer by hand and then parsing with stream parsers
<flux> orbitz, write it by hand or perhaps use Pcre
<flux> but you should not dismiss the value of ulex or ocamllex especially if you haven't used them before
<orbitz> ok
<orbitz> I'll play around with one
<orbitz> thanks
<ggole> Lexers aren't terribly hard to write by hand
<ggole> It's just inflexible
ontologiae_ has joined #ocaml
<orbitz> Yeah i think icould do most of this by hand, but I should probably learn some standard tools
zRecursive has left #ocaml []
hkBst has joined #ocaml
hkBst has quit [Changing host]
hkBst has joined #ocaml
mika1 has joined #ocaml
cago has joined #ocaml
ttamttam has joined #ocaml
cago has quit [Ping timeout: 246 seconds]
ontologiae_ has quit [Ping timeout: 248 seconds]
thomasga has joined #ocaml
gnuvince has quit [Ping timeout: 264 seconds]
sgnb has quit [Remote host closed the connection]
cago has joined #ocaml
vpm has quit [Quit: co'o]
sgnb has joined #ocaml
ygrek has joined #ocaml
ulfdoz has joined #ocaml
ontologiae_ has joined #ocaml
ocp has joined #ocaml
ulfdoz has quit [Ping timeout: 264 seconds]
xenocons has quit [Changing host]
xenocons has joined #ocaml
avsm has quit [Quit: Leaving.]
vpm has joined #ocaml
bondar has joined #ocaml
bondar has quit [Excess Flood]
bondar has joined #ocaml
bondar has quit [Client Quit]
bondar has joined #ocaml
Simn has joined #ocaml
mye has joined #ocaml
zRecursive has joined #ocaml
avsm has joined #ocaml
darkf has quit [Ping timeout: 248 seconds]
<zRecursive> `echo "sqrt 1000000. ;;" | ocaml -noprompt` works great. But the Findlib banner is annoying. Can i suppress the output of Findlib ?
<adrien_> no ocamlinit?
<adrien_> you probably have ~/.ocamlinit: findlib is not loaded by default
<adrien_> (opam install?)
<zRecursive> yeah, i need ~/.ocamlinit and findlib. because i want to eval some functions in Foo.ml
<zRecursive> i.e. echo "func1 ;;" | ocaml ... func1 is in Foo.ml
<zRecursive> it will be perfect if i can suppress the banner of Findlib
<sgnb> the OCaml banner itself doesn't annoy you?
darkf has joined #ocaml
<zRecursive> sgnb: just one line
<avsm> the latest findlib has a flag to suppress the verbose output, iirc
<zRecursive> seems we cannot suppress the Findlib banner :-D
<avsm> dimlasked for it for utop to use
<adrien_> zRecursive: you can filter it out then
<zRecursive> adrien_: yeah, trying `tail` now ...
<adrien_> or | grep -v '^#'
<zRecursive> adrien_: it has indent so `grep...` not work
<adrien_> '^ #' :D
<adrien_> or ' \+#'
<zRecursive> echo "sqrt 1000000. ;;" | ocaml -noprompt | grep -v ' \+^#' not work
<zRecursive> how to use `tail` to skip any lines ?
<mrvn> tail --lines +5
<zRecursive> thx
<mrvn> might not be legal to do so though. check the license.
<ggole> Isn't # the prompt? Why are you grepping for it if you disabled it?
<zRecursive> echo "sqrt 1000000. ;;" | ocaml -noprompt | tail +16 works
csakatok_ has quit [Remote host closed the connection]
mcclurmc has joined #ocaml
avsm has quit [Quit: Leaving.]
introom has quit [Remote host closed the connection]
watermind has joined #ocaml
zRecursive has left #ocaml []
djcoin has joined #ocaml
avsm has joined #ocaml
avsm has left #ocaml []
avsm_ has joined #ocaml
q66 has joined #ocaml
dsheets has quit [Ping timeout: 245 seconds]
csakatoku has joined #ocaml
ollehar has joined #ocaml
beckerb has joined #ocaml
dsheets has joined #ocaml
Drup has joined #ocaml
ocp has quit [Ping timeout: 268 seconds]
ygrek has quit [Ping timeout: 268 seconds]
beckerb has quit [Quit: Konversation terminated!]
beckerb has joined #ocaml
introom has joined #ocaml
ollehar has quit [Ping timeout: 246 seconds]
mort___ has joined #ocaml
ollehar has joined #ocaml
osa1 has joined #ocaml
csakatoku has quit [Ping timeout: 246 seconds]
cago has quit [Ping timeout: 248 seconds]
cago has joined #ocaml
ygrek has joined #ocaml
mcclurmc has quit [Read error: Connection reset by peer]
mcclurmc has joined #ocaml
ocp has joined #ocaml
beginner42 has joined #ocaml
<beginner42> do lwt threads use every available core?
<adrien_oww> no
<beginner42> so there is no proper way to do multithreading?
<mrvn> you can use the Thread module. But that only helps if you have C functions doing most of the work.
<beginner42> but the thread module doesnt provide concurrency
<mrvn> sure it does, for C functions.
<adrien_oww> or actually, for code that doesn't allocate
<mrvn> for code that releases the runtime lock
<beginner42> yes, ok but i only have ocaml functions i want to run in parallel
<mrvn> then you need to look into multiprocessing
<whitequark> or ocamljava
<beginner42> so start more ocaml processes and distribute tasks between them
<Drup> beginner42: what sort of task are you trying to do ?
<mrvn> and do some IPC
cago has quit [Ping timeout: 264 seconds]
cago has joined #ocaml
demonimin has quit [Ping timeout: 256 seconds]
<beginner42> what is then the advantage of using lwt?
mye has quit [Quit: mye]
<pippijn> beginner42: concurrent I/O
<mrvn> all the nice non-blocking functions for IO
introom has quit [Remote host closed the connection]
<orbitz> For orchestrating your forks that you will use to run your code in parallel
<pippijn> beginner42: what do you want to use multi-processing for?
<pippijn> orbitz: right
<pippijn> beginner42: you can use lwt_preemptive (or what it's called)
<beginner42> pippijn: i have a set of larger tree structures which i would like to process in parallel
<orbitz> beginner42: depending on the interface, you can use Parmap
<beginner42> pippijn: lwt_preemptive, what does it do?
<orbitz> or I have a similar problem, where I have a tree that represents input files and i walk the tree running commands on the files
<pippijn> beginner42: spawn processes
<pippijn> actually, maybe not so useful
<pippijn> that probably uses ocaml threads
<orbitz> If you actaully want ocaml code to run in paralel you need to fork
<beginner42> so all those big companies like jane street do parallel programming with spawned processes?
<orbitz> yes
<pippijn> beginner42: people who do massive multi-processing usually use processes
<orbitz> Or they're trying to sell you a idstribtued threading model that probbaly don't work :)
Drup has quit [Ping timeout: 246 seconds]
<beginner42> not enough money for that ;) but this parmap sounds good
<orbitz> just don't tell jon you're using processes
<adrien_oww> ^ ^
<adrien_oww> I think beginner42 hasn't known him ;-)
<adrien_oww> s/hasn't/doesn't/
<beginner42> enlighten me, who is this jon? :)
<orbitz> He'll be your bffl if you use F#
<beginner42> dexit
<beginner42> ups, wrong window
<beginner42> thanks at all for your advices
beginner42 has quit [Quit: irc2go]
mye has joined #ocaml
ontologiae_ has quit [Ping timeout: 264 seconds]
ontologiae_ has joined #ocaml
amirmc has joined #ocaml
introom has joined #ocaml
mort___ has quit [Ping timeout: 276 seconds]
pzv has joined #ocaml
introom has quit [Remote host closed the connection]
<pzv> Can anyone point me what's wrong with this piece of code? Why "Hello3" is not printed? http://ideone.com/JUIFVZ
csakatoku has joined #ocaml
<pippijn> pzv: you probably need to flush the formatter
<pzv> it helped. Thanks
Simn has quit [Quit: Leaving]
ygrek has quit [Ping timeout: 245 seconds]
csakatoku has quit [Remote host closed the connection]
csakatoku has joined #ocaml
csakatoku has quit [Remote host closed the connection]
csakatoku has joined #ocaml
ocp has quit [Ping timeout: 246 seconds]
csakatoku has quit [Ping timeout: 248 seconds]
darkf has quit [Quit: Leaving]
smondet has joined #ocaml
osa1 has quit [Quit: Konversation terminated!]
ollehar has quit [Remote host closed the connection]
demonimin has joined #ocaml
ygrek has joined #ocaml
ttamttam has quit [Quit: ttamttam]
Simn has joined #ocaml
ontologiae_ has quit [Read error: Connection reset by peer]
cago has quit [Ping timeout: 256 seconds]
mika1 has quit [Quit: Leaving.]
csakatoku has joined #ocaml
ocp has joined #ocaml
amirmc has quit [Quit: Leaving.]
csakatoku has quit [Ping timeout: 276 seconds]
amirmc has joined #ocaml
ygrek has quit [Ping timeout: 264 seconds]
palomer has joined #ocaml
<palomer> hey, anyone know how to resolve shift/reduce conflicts in ocaml?
ontologiae_ has joined #ocaml
<pippijn> palomer: just like you would in other languages
<palomer> ocamlyacc I meant
<palomer> by specifying the precedence of the rule vs the token
<palomer> I read the docs, but I can't figure out how to do it
<palomer> %nonassoc expr <-- I can't seem to specify the precedence of the rule
<pippijn> you could encode the precedence in the grammar
<pippijn> but precedences like %nonassoc are written in order
<palomer> eh?
<pippijn> The precedence of an operator determines how it nests with other operators. All the tokens declared in a single precedence declaration have equal precedence and nest together according to their associativity. When two tokens declared in different precedence declarations associate, the one declared later has the higher precedence and is grouped first.
shinnya has joined #ocaml
<palomer> right
<palomer> A shift/reduce conflict is resolved by comparing the precedence of the rule to be reduced with the precedence of the token to be shifted. If the precedence of the rule is higher, then the rule will be reduced; if the precedence of the token is higher, then the token will be shifted.
<palomer> how do I say that I want the token to be shifted?
<palomer> ie, how do I say that the precedence of the token to be shifted is higher than the rule to be reduced?
pzv has quit [Read error: Connection reset by peer]
<whitequark> what specifically do you want to do? post your grammar
<whitequark> also, menhir has much more clear error messages
pzv has joined #ocaml
<palomer> there's my grammar
<palomer> so the second expr in the LET is the problem
<palomer> http://pastebin.com/2h76mKh4 <-- actually this one is better
<palomer> consider LET IDENT EQUAL IDENT IN IDENT IDENT
<palomer> the conflict is on the last IDENT
amirmc has quit [Quit: Leaving.]
pzv_ has joined #ocaml
pzv has quit [Ping timeout: 264 seconds]
amirmc has joined #ocaml
pzv has joined #ocaml
pzv_ has quit [Read error: Connection reset by peer]
djcoin has quit [Quit: WeeChat 0.4.0]
<ggole> My guess it that the conflict is between (LET IDENT EQUAL IDENT IN IDENT) IDENT and LET IDENT EQUAL IDENT IN (IDENT IDENT)
<ggole> Refactor the grammar.
pzv has quit [Read error: Connection reset by peer]
pzv has joined #ocaml
avsm_ is now known as avsm
dsheets has quit [Ping timeout: 246 seconds]
ocp has quit [Ping timeout: 268 seconds]
thomasga has quit [Quit: Leaving.]
Arsenik has joined #ocaml
ontologiae_ has quit [Read error: Operation timed out]
amirmc has quit [Quit: Leaving.]
amirmc has joined #ocaml
hkBst has quit [Quit: Konversation terminated!]
bkpt has joined #ocaml
beckerb has quit [Ping timeout: 245 seconds]
amirmc has quit [Quit: Leaving.]
demonimin has quit [Ping timeout: 256 seconds]
ocp has joined #ocaml
mort___ has joined #ocaml
beginner42 has joined #ocaml
<beginner42> how can i tell oasis that i want to use parmap? i added parmap to the BuildDepends and made ocaml setup.ml -configure
<beginner42> but i still get unbound module parmap
<mrvn> beginner42: oasis setup; make
<beginner42> mrvn: doesnt work
<mrvn> beginner42: oasis setup; make distclean; make
<mrvn> or throw in a ./configure
pango_ has joined #ocaml
<beginner42> sorry made a very stupid mistake here, but now your command works. Thanks a lot :)
pango has quit [Disconnected by services]
pango_ is now known as pango
<mrvn> every time you edit _oasis you need to run oasis again. Or give the option to do that automatically next time.
<mrvn> Somehoe game developement has too many circular depends. I end up with most of the game engine all in one file.
<mrvn> s/Somehoe/Somehow/
<mrvn> Maybe I should be using classes.
pzv has quit [Read error: Connection reset by peer]
mcclurmc has quit [Quit: Leaving.]
pzv has joined #ocaml
bkpt has quit [Remote host closed the connection]
mort___ has quit [Quit: Leaving.]
companion_square is now known as compnaion_cbue
ollehar has joined #ocaml
csakatoku has joined #ocaml
mcclurmc has joined #ocaml
ontologiae_ has joined #ocaml
amirmc has joined #ocaml
csakatoku has quit [Ping timeout: 276 seconds]
amirmc has quit [Quit: Leaving.]
ocp has quit [Read error: Operation timed out]
Drup has joined #ocaml
ocp has joined #ocaml
Yonex has joined #ocaml
ulfdoz has joined #ocaml
Yonex has quit [Read error: Connection reset by peer]
Yonex has joined #ocaml
palomer has quit [Ping timeout: 264 seconds]
csakatoku has joined #ocaml
gnuvince has joined #ocaml
pzv has quit [Read error: Connection reset by peer]
pzv_ has joined #ocaml
gnuvince has quit [Changing host]
gnuvince has joined #ocaml
csakatoku has quit [Ping timeout: 256 seconds]
ollehar has quit [Quit: ollehar]
palomer has joined #ocaml
ggole has quit []
Arsenik has quit [Quit: Quitte]
ulfdoz has quit [Ping timeout: 240 seconds]
palomer has quit [Ping timeout: 248 seconds]
Patchou has quit [Quit: KVIrc 4.0.4 Insomnia http://www.kvirc.net/]
tane has joined #ocaml
demonimin has joined #ocaml
PM has quit [Ping timeout: 256 seconds]
mort___ has joined #ocaml
bkpt has joined #ocaml
PM has joined #ocaml
mort___ has quit [Quit: Leaving.]
gnuvince has quit [Ping timeout: 256 seconds]
dsheets has joined #ocaml
ocp has quit [Ping timeout: 245 seconds]
malo has joined #ocaml
mort___ has joined #ocaml
ulfdoz has joined #ocaml
avsm1 has joined #ocaml
tane has quit [Quit: Verlassend]
adrien_ is now known as adrien
<adrien> 110 seconds to "make world" on my laptop with camlp4, ocamlbuild, ocamldebug, ocamldoc disabled (although with a ccache)
<adrien> and...
<adrien> 360 seconds for "make world" with everything enabled
<adrien> need to check I haven't wrongly "disabled" some of the components like I had done before
<bernardofpc> adrien: and that make the whole Earth like the Hitchiker's Guide ?
<compnaion_cbue> don't type "make clean" before you got the question that corresponds to "42"
avsm has left #ocaml []
thomasga has joined #ocaml
mcclurmc has quit [Quit: Leaving.]
csakatoku has joined #ocaml
csakatoku has quit [Ping timeout: 268 seconds]
<compnaion_cbue> so, what can we do to appease Gerd?
mort___ has quit [Quit: Leaving.]
ulfdoz has quit [Ping timeout: 256 seconds]
thomasga has quit [Quit: Leaving.]
rixed_ has joined #ocaml
osa1 has joined #ocaml
ollehar has joined #ocaml
pzv_ has quit [Ping timeout: 248 seconds]
<avsm1> i have no idea what the hell "respect" means
<compnaion_cbue> I guess here it's about acknowledging Gerd's work and the qualities of his software
milosn_ has joined #ocaml
milosn has quit [Ping timeout: 240 seconds]
beginner42 has quit [Quit: irc2go]
rixed_ has quit [Quit: leaving]
Drup has quit [Ping timeout: 246 seconds]
palomer has joined #ocaml
<dsheets> compnaion_cbue, your transpositional flux capacitor is on the fritz
<compnaion_cbue> I know, it's hype
<dsheets> avsm1, respect means taking out the tcb
malo has quit [Quit: Leaving]
ontologiae_ has quit [Ping timeout: 268 seconds]
csakatoku has joined #ocaml
Drup has joined #ocaml
gnuvince has joined #ocaml
gnuvince has quit [Changing host]
gnuvince has joined #ocaml
<ollehar> what was the name of that language made in ocaml that compiles to javascript? (not ocaml :) )
<ollehar> with static typing
csakatoku has quit [Ping timeout: 256 seconds]
<compnaion_cbue> opa ?
<ollehar> checking...
<ollehar> actually I think not
<ollehar> it's interesting, though
<compnaion_cbue> haxe ?
<ollehar> yep!
<ollehar> thanks!
<ollehar> do you use it?
<ollehar> I'm looking for an alternative to js, or some type checking stuff at least
<compnaion_cbue> I don't, but it looks nice
<compnaion_cbue> why not js_of_ocaml then?
<ollehar> yeah, I will check that out, too
<ollehar> but it need to accept dom hacking
<compnaion_cbue> it's designed for the web, so I suppose it can do that ^^
<compnaion_cbue> but I never tried
JcGood has joined #ocaml
JcGood has quit [Read error: Connection reset by peer]
<Drup> ollehar: you can definitely do dom hacking with js_of_ocaml
<ollehar> nice, it has websockets, too.
amirmc has joined #ocaml
amirmc has quit [Client Quit]
<ollehar> on the other hand it might be refreshing using not only ocaml :P
<ollehar> \k
Nahra_ has joined #ocaml
bkpt has quit [Quit: Leaving]
dsheets has quit [*.net *.split]
cdidd has quit [*.net *.split]
Nahra has quit [*.net *.split]
dsheets has joined #ocaml
cdidd has joined #ocaml
bkpt has joined #ocaml
bkpt has quit [Client Quit]
Yonex has quit [Read error: Connection reset by peer]
palomer has quit [Ping timeout: 268 seconds]
Neros has quit [Read error: Operation timed out]
mehdid has quit [Ping timeout: 260 seconds]
<ollehar> no tutorials for js_of_ocaml ;(
Neros has joined #ocaml
mehdid has joined #ocaml
<Drup> ollehar: you can find some help in eliom tutorials
<ollehar> Drup: ok, I'll check that
<ollehar> Also, the source code for the examples might help