# [Haskell-cafe] A 3 line program --> Reid, Don, Daniel

Philippos Apolinarius phi500ac at yahoo.ca
Sat Oct 24 22:03:35 EDT 2009

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{}

% Last change 2007-05-23

\newcount\evalFilecount
\evalFilecount=0

\csname newwrite\endcsname\progPort
\immediate\openout\progPort H\jobname.hs %
\immediate\write\progPort{module H\jobname}%
\immediate\write\progPort{where}%
\newlinechar=\^^M%
\newlinechar=\^^M%
}%
}

\catcode\^^M=12
}

\immediate\write\progPort{#1}%
\endgroup
}

The second file is hask.ell and it defines \eval{}.  It is slightly more complex than the previous one. Still, it is very simple.

% 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
\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
}

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}

\author{Philippos Apolinarius}
\date{}

\begin{document}
\maketitle

}

\eval{ hPutStrLn outh (show (fat 6))
}

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.

__________________________________________________________________