Thank you for your help. I am sure that you are right as to the cause of the
problem. However, I do not know what I should do to solve it. The Haskell
program is generated by LaTeX macros. It is useless to import System.IO.UTF8.
I did it. The system keeps producing the same error. What I need is to
configure GHC to accept input from any editor, or text generating tool (like
TeX). I suppose it is not very difficult to do it, since all other languages
have it. I mean, Haskell is the only language where I cannot type a common
word like "façade" without running into trouble.
I will send you a slightly more complete program, so you can analyse the
problem. One has two programs in Tex, and an example. The first file is
haskell.gen and it defines the macro \haskell{}
% Store in file haskell.gen
% Last change 2007-05-23
\newcount\evalFilecount
\evalFilecount=0
{\gdef\haskellSetup{%
\csname newwrite\endcsname\progPort
\immediate\openout\progPort H\jobname.hs %
\immediate\write\progPort{module H\jobname}%
\immediate\write\progPort{where}%
\newlinechar=`\^^M%
\newlinechar=`\^^M%
}%
}
\newcommand{\haskell}{\begingroup
\ifx\progPort\UNDEFINED \haskellSetup\fi%
\catcode`\^^M=12
\haskellGen
}
\newcommand{\haskellGen}[1]{%
\immediate\write\progPort{#1}%
\endgroup
}
%end of file haskell.gen
The second file is hask.ell and it defines \eval{}. It is slightly more
complex than the previous one. Still, it is very simple.
% Store in file hask.ell
% Last change 2007-05-23
\newcount\evalFilecount
\evalFilecount=0
{\gdef\evalSetup{%
\csname newwrite\endcsname\outPort % Port name
\immediate\openout\outPort \jobname.hs %
\newlinechar=`\^^M%
\immediate\write\outPort{import H\jobname}%
\newlinechar=`\^^M%
\immediate\write\outPort{import IO}%
\newlinechar=`\^^M%
\immediate\write\outPort{main= do }%
\newlinechar=`\^^M%
}%
}
\newcommand{\eval}{\begingroup
\ifx\outPort\UNDEFINED \evalSetup\fi
\global\advance\evalFilecount by 1
\edef\evalAuxFile{\jobname-G-H-C\the\evalFilecount}%
\immediate\write\outPort
{ outh <- openFile "\evalAuxFile.ghc" { WriteMode;} }%
{\immediate\openin0=\evalAuxFile.ghc
\ifeof0 \immediate\closein0
\else \input \evalAuxFile.ghc \fi}%
\catcode`\^^M=12
\evalBody
}
\newcommand{\evalBody}[1]{%
\immediate\write\outPort{#1}%
\immediate\write\outPort{ hClose outh;}%
\endgroup
}
%end of file hask.ell
Below, there is an example of how to use the above macros. Store it in file
tudin.tex.
\documentclass[12pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[brazil]{babel}
\usepackage{makeidx}
\usepackage{wrapfig}
\usepackage{pictexwd}
\title{Calling Haskell from \LaTeX}
\author{Philippos Apolinarius}
\date{}
\begin{document}
\maketitle
\input haskell.gen
\input hask.ell % load \eval
\eval{ hPutStrLn outh "Hello, facade!"
}
\eval{ hPutStrLn outh (show (fat 6))
}
\haskell{
fat n | n<1= 1
fat n= n*fat(n-1)
}
\end{document}
In order to use these examples, do the following:
1 --- Apply latex to tudin.tex:
C:\hastex> latex tudin.tex
2 --- You have generated file tudin.hs and Htudin.hs. Execute tudin.hs:
C:\hastex> runghc tudin.hs
This action will generate two files: tudin-G-H-C1.ghc, and tudin-G-H-C2.ghc.
There is one file for each instance of \eval{}.
3 --- If you run latex tudin.tex again, it will load these two files, and
insert the results of the Haskell programs into the resulting pdf or dvi files.
C:\hastex> latex tudin.tex
My friend has a lot of complex Clean libraries that she uses to generate
postscript images of her designs. The trouble is that she needs to compile
Clean souce code generated by the two LaTeX macros. SInce Clean needs two
files per module (implementation module and definition module), the two LaTeX
macros are quite complex. Clean looks a lot like Haskell. Therefore, I believe
that she will not have any difficulty in translating the code to Haskell. It is
true that input/output is different in Clean and Haskell. However, input/output
can be centered in the main function. Unhappily she needs to write all those
French, Swiss, Italian and Spanish names, like façade, Antoní Gaudi, Xenákes,
etc. BTW, if you discover how to use strings in Haskell, one could write
Haskell-café, instead of Haskell-cafe.
__________________________________________________________________
Looking for the perfect gift? Give the gift of Flickr!
http://www.flickr.com/gift/_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe