Linear interpolation
DSL Function
DrawLine (InitX, InitY, InitZ, EndX, EndY, Height, Feedrate, dx)
Curry program for the DSL function

------------------------------------------------------------------------------
------------- LINEA ----------------------------------------------------------
------------------------------------------------------------------------------

{-- FUNCION AUXILIAR --}
FAUX_DrawLine :: (Float, Float, Float, Float, Float, Float, Float, Float) -> IO()
FAUX_DrawLine(InitX, InitY, EndX, EndY, Height, Feedrate, halfdx, control) = do Draw

where
Draw =
if ((Height >= control)&&((Height-.control) >= halfdx))||(Height==control)
then do
writefile(GotoXY(InitX,InitY))
writefile(DrawZ(control,Feedrate))
writefile(DrawXY(EndX,EndY,Feedrate))
FAUX_DrawLine(InitX,InitY,EndX,EndY,Height,Feedrate,halfdx,(control+.halfdx))
--Se usa para compensar....
else if ((Height >= control)&&((Height-.control) < halfdx))
then do
writefile(GotoXY(InitX,InitY))
writefile(DrawZ(control,Feedrate))
writefile(DrawXY(EndX,EndY,Feedrate))
FAUX_DrawLine(InitX,InitY,EndX,EndY,Height,Feedrate,halfdx,
(control+.(Height-.control)))
else done
{-- FUNCION PRINCIPAL --}

-- Funcion para dibujar una linea recta en el plano XY
-- Indicar punto XYZ inicial, punto XY final y profundidad del corte.

DrawLine :: (Float, Float, Float, Float, Float, Float, Float, Float) -> IO()
DrawLine (InitX, InitY, InitZ, EndX, EndY, Height, Feedrate, dx) = do InitPOS
Perforate

where
InitPOS = writefile(GotoXYZ(InitX, InitY, InitZ))
-- Si el ancho de la herramienta es mayor que la profundidad
Perforate = if (Height<dx)
then do
writefile(DrawZ(Height,Feedrate))
writefile(DrawXY(EndX,EndY,Feedrate))
-- Si el ancho de la herramienta es menor que la profundidad
else do
FAUX_DrawLine(InitX,InitY,EndX,EndY,Height,Feedrate, (0.5*.dx),(0.5*.dx))

example figure