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

Reply via email to