summaryrefslogtreecommitdiff
path: root/ws2015/ffp/blaetter/11/FFP_U11-4_TemplateHaskell.hs
blob: 05668a721a8a59872939affb456c47196ae95329 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
-- Fortgeschrittene Funktionale Programmierung, 
--   LMU, TCS, Wintersemester 2015/16
--   Steffen Jost, Alexander Isenko
--
-- Übungsblatt 11. 13.01.2016
--
-- Teilaufgabe 
-- A11-4a TemplateHaskell
--
-- Im Modul GameUnits sind einige 
-- Kreaturen definiert, und eine Funktion,
-- um zwei gegeneinander Kämpfen zu lassen,
-- wie in Übungsblatt 7 bereits verwendet.
--
-- Es ist nervig, jedes Mal die komplette Figur einzugeben,
-- weshalb wir Konstanten definieren möchten, etwa so:
{-
units = 
    [ unit{ name = "Scout", str= 5 }
    , unit{ name = "Crow",  str= 5, hit=1, flyer=True }
    , unit{ name = "Orc",   str=20, hit=1 }
    ]
    
scout = units !! 0
crow  = units !! 1
orc   = units !! 2
-}

-- Es ist jedoch schwierig, dies konsistent zu halten!
-- Schreiben Sie innerhalb des Moduls GameUnit eine
-- Funktion, welche die entsprechende Konstanten-Deklaration
-- für alle Einheiten der stockUnitList automatisch generiert,
-- so dass der folgende Code danach funktioniert!

-- Hinweis: Dazu benötigen Sie vermutlich 
--  aus Modul Language.Haskell.TH folgende Definitionen
--  ValD, VarP, NormalB, newName und QuasiQuoting
-- 

{-# LANGUAGE TemplateHaskell #-}


import GameUnits


$(stockUnitShortcuts)


main = do
  dobattle orc elf
  dobattle orc elf
  dobattle elf dwarf
  dobattle elf dwarf
  dobattle elf dwarf
  dobattle elf dwarf
  
  
  
dobattle :: Unit -> Unit -> IO ()
dobattle att def = do
  putStrLn $ "Attacker: " ++ name att
  putStrLn $ "Defender: " ++ name def
  winner <- battle att def
  putStrLn $ "Winner: " ++ show winner
  putStrLn "---"