+module test
+
+import Data.Func
+import StdEnv, StdGeneric
+
+:: IsR a = IsR Bool | IsROnzin a
+unIsR (IsR b) = b
+generic gIsRecursive a :: [String] -> IsR a
+gIsRecursive{|Bool|} _ = IsR False
+gIsRecursive{|Char|} _ = IsR False
+gIsRecursive{|Real|} _ = IsR False
+gIsRecursive{|Int|} _ = IsR False
+gIsRecursive{|{}|} a m = IsR $ unIsR (a m)
+gIsRecursive{|{!}|} a m = IsR $ unIsR (a m)
+gIsRecursive{|{!!}|} a m = IsR $ unIsR (a m)
+gIsRecursive{|UNIT|} _ = IsR False
+gIsRecursive{|EITHER|} l r m = IsR $ unIsR (l m) || unIsR (r m)
+gIsRecursive{|PAIR|} l r m = IsR $ unIsR (l m) || unIsR (r m)
+gIsRecursive{|CONS|} x m = IsR $ unIsR (x m)
+gIsRecursive{|FIELD|} x m = IsR $ unIsR (x m)
+gIsRecursive{|RECORD of grd|} x m
+ | isMember grd.grd_name m = IsR True
+ = IsR $ unIsR (x [grd.grd_name:m])
+gIsRecursive{|OBJECT of gtd|} x m
+ | isMember gtd.gtd_name m = IsR True
+ = IsR $ unIsR (x [gtd.gtd_name:m])
+
+:: R = {f1 :: Int, f2 :: Bool, f3 :: [R]}
+derive gIsRecursive [], R
+
+//Start :: IsR [Int]
+Start :: IsR R
+Start = gIsRecursive{|*|} []