Difference between revisions of "Yhc/API/Core"
NeilMitchell (talk | contribs) |
NeilMitchell (talk | contribs) |
||
Line 41: | Line 41: | ||
map2 f [] = [] |
map2 f [] = [] |
||
− | map2 f (x:xs) = f x : |
+ | map2 f (x:xs) = f x : map2 f xs |
test x = map2 head2 x |
test x = map2 head2 x |
||
Line 60: | Line 60: | ||
case v224 of |
case v224 of |
||
[] -> [] |
[] -> [] |
||
− | (:) v225 v226 -> (:) (v223 v225) (Sample. |
+ | (:) v225 v226 -> (:) (v223 v225) (Sample.map2 v223 v226) |
Sample.test v227 = Sample.map2 Sample.head2 v227 |
Sample.test v227 = Sample.map2 Sample.head2 v227 |
||
</haskell> |
</haskell> |
||
+ | Note that all names have been fully qualified, there are no infix operators, all pattern matches have been converted to case's. |
||
== Some little samples == |
== Some little samples == |
Revision as of 21:37, 15 October 2006
Part of Yhc |
Yhc Core is a way of dumping and using the internal representation of Yhc in an external project.
Haddock Documentation
Overview
Yhc.Core is a simple core Haskell-like language, feature case statements, let statements, top level lambda's and data values. Much of the syntactic sugar present in Haskell has gone (list comprehensions, typeclasses, overloaded names, nested lambdas)
The strengths of Yhc.Core are:
- Simple representation of Haskell
- Relatively simple to relate Core to original Haskell
- Source locations are preseved
- Minimal name mangling
- Few synactic forms
The weaknesses are:
- Yhc cannot compile Yhc Core files, format is write only (fix is being worked on)
- Types are not present (hard to fix, a lot of work)
The intended users:
- Analysis tools
- Compiler backends
Generating Core
Yhc Core files are stored as .ycr files in a binary format. They can be generated by passing the -corep flag to the compiler, yhc -corep Main.hs. If Core files are required for the standard libraries these can be build using scons core=1. To view the Core output, yhc -core Main.hs, with the output going to the screen in a pretty printed format.
The Core output
For an example of the Core output, taking the following program:
head2 (x:xs) = x
map2 f [] = []
map2 f (x:xs) = f x : map2 f xs
test x = map2 head2 x
Generates:
Sample.head2 v220 =
case v220 of
(:) v221 v222 -> v221
_ -> Prelude.error Sample._LAMBDA228
Sample._LAMBDA228 =
"Sample: Pattern match failure in function at 9:1-9:15."
Sample.map2 v223 v224 =
case v224 of
[] -> []
(:) v225 v226 -> (:) (v223 v225) (Sample.map2 v223 v226)
Sample.test v227 = Sample.map2 Sample.head2 v227
Note that all names have been fully qualified, there are no infix operators, all pattern matches have been converted to case's.
Some little samples
Hello World, for Core
The following snipet loads a Core file and prints it out.
import Yhc.Core
showFile x :: FilePath -> String
showFile x = liftM show (loadCore x)
See Also
Users
- Catch - Case and Termination Checker for Haskell by Neil Mitchell. This takes Core as an input.
- Dr Haskell - give hints to beginners about useful Haskell functions/idioms.