some unfinished work (from Thera island and later)
[svn/Cll1h/.git] / demos / objects / objects-wiki.c
index 7d57c7042d34481ea35cfc9818dc31d85db6df84..e55cb7439a3a2ebcfb6612ee3cac2bd811ad8f10 100644 (file)
@@ -1,58 +1,64 @@
-#include <cll1.h>
+#include "cll1.h"
 
 /* This is C<<1 rewrite of object polymorphism from
    http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming */
 
-struct Animal
+def_type(Animal);
+
+def_mem(Actions)
 {
use_interface(AnimalActions);
char *name;
Animal method(init) (Animal self, str name);
str method(talk) (Animal self);
 };
 
-struct AnimalActions
+def_obj(Animal)
 {
- const char *(method(talk));
-}
+ interface(Actions);
+ char *name;
+};
 
-struct *Animal get_animal(char *name, struct AnimalActions *interface)
+str cat_talk(Animal self)
 {
- struct *Animal animal=get_object(Animal,interface);
- animal->name=name;
- return animal;
+ return "Meow!";
 }
 
-const char *cat_talk(void *_self)
+str dog_talk(Animal self)
 {
- return "Meow!";
+ return "Arf! Arf!";
 }
 
-const char *dog_talk(void *_self)
+Animal animal_init(Animal self, str name)
 {
- return "Arf! Arf!";
+ self->name = name;
+ return self;
 }
 
-interface_implementation(CatActions,AnimalActions)
+Actions cat_actions(Actions this)
 {
- bind_method(talk,cat_talk);
+ this->init = animal_init;
+ this->talk = cat_talk;
 }
 
-interface_implementation(DogActions,AnimalActions)
+Actions dog_actions(Actions this)
 {
- bind_method(talk,dog_talk);
+ this->init = animal_init;
+ this->talk = dog_talk;
 }
 
 program
 {
  int i;
struct Animals *animal[3];
struct AnimalActions *cat = get_interface(CatActions);
struct AnimalActions *dog = get_interface(DogActions);
Animal animal[3];
Actions cat = cat_actions();
Actions dog = dog_actions();
 
- animal[0]=get_animal("Missy",cat);
- animal[0]=get_animal("Mr. Bojangles",cat);
- animal[0]=get_animal("Lassie",dog);
- for_range(i,0,2)
-  printf("%s: %s\n",animal[i].name,(_(animal[i],talk)));
+ animal[0] = init_obj(Animal, Actions, cat)
+  "Missy");
+ animal[1] = init_obj(Animal, cat, "Mr. Bojangles");
+ animal[2] = init_obj(Animal, dog, "Lassie"); 
 
+ for_range(i, 0, 2)
+ {
+  printf("%s: %s\n", animal[i].name, _(talk, animal[i]));
+ }
 }
This page took 0.15642 seconds and 4 git commands to generate.