From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id 2D257BBCA for ; Tue, 26 Feb 2008 12:35:15 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAADKIw0fAXQInh2dsb2JhbACQZAEBAQgKKYENmk8 X-IronPort-AV: E=Sophos;i="4.25,407,1199660400"; d="ml'?scan'208";a="23056570" Received: from concorde.inria.fr ([192.93.2.39]) by mail4-smtp-sop.national.inria.fr with ESMTP; 26 Feb 2008 12:35:14 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by concorde.inria.fr (8.13.6/8.13.6) with ESMTP id m1QBZEju024048 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Tue, 26 Feb 2008 12:35:14 +0100 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgAAADKIw0fBL1AZfGdsb2JhbACQVw0BAQkEBimBDZpP X-IronPort-AV: E=Sophos;i="4.25,407,1199660400"; d="ml'?scan'208";a="7715998" Received: from gw.exalead.com (HELO exalead.com) ([193.47.80.25]) by mail2-smtp-roc.national.inria.fr with ESMTP; 26 Feb 2008 12:35:14 +0100 Received: from [192.168.204.148] (madpc064.exalead.com [192.168.204.148]) (authenticated bits=0) by exalead.com (8.14.0/8.14.0) with ESMTP id m1QBZABM022457 for ; Tue, 26 Feb 2008 12:35:13 +0100 Message-ID: <47C3F96E.4080901@exalead.com> Date: Tue, 26 Feb 2008 12:35:10 +0100 From: Berke Durak User-Agent: Thunderbird 1.5.0.10 (X11/20070221) MIME-Version: 1.0 To: Caml-list List Subject: Objects, dynamic cast, Obj.magic abuse and dragons Content-Type: multipart/mixed; boundary="------------090803070103080003010205" X-Miltered: at concorde with ID 47C3F972.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; berke:01 durak:01 berke:01 durak:01 functors:01 ocaml's:01 runtime:01 pointer:01 scalable:01 parametrize:01 printf:01 printf:01 buffer:01 buffer:01 val:01 X-Attachments: cset="UTF-8" name="adventure.ml" name="adventure.ml" This is a multi-part message in MIME format. --------------090803070103080003010205 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hello, It seems that objects are back in fashion again on the list. As records of functions or functors dont quite cut the mustard for some applications, I decided to give Ocaml's object system another try. I tried to implement a conventional text adventure using those, of the "go north take sword kill dragon" kind. Actually I had one such small prototype I wrote while learning Java, so I decided to port that one. I've stumbled on a situation where I feel dynamic casting could be useful. At least, that is the way I did it in the Java version. I've worked around it using Obj.magic, but I can't check the class, so this could lead to nastiness. I'd rather eat a runtime Class_cast_exception than a segmentation fault. In this adventure, things can contain other things; a class physical has a list of things it contains, and an optional pointer to its container. Persons, places and objects are things so they inherit from physical. Hence, a forest is a place that can contain a sword (an object), a dragon (a person) or another place (a small house). Persons can be contained in places or things (coffins). The problem is that the main game loop gets the current location by taking the container of the hero... which is a physical. However, it needs to call the place-specific method "go". I'm submitting my example so that you can propose alternative solutions. A few ideas: * Add a go method in physical, raise an exception - not scalable, if I want to add other categories of things, I'll have to add the corresponding method to physical. * Parametrize physical with the type of contents. * Use a sum type; but then it wouldn't be an object any more, and it's a centralized place. -- Berke DURAK --------------090803070103080003010205 Content-Type: text/plain; name="adventure.ml" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="adventure.ml" KCogQWR2ZW50dXJlICopCgpleGNlcHRpb24gUXVpdEV4Y2VwdGlvbgoKbGV0IG1hbmRhdG9y eSA9IGZ1bmN0aW9uCiAgfCBOb25lIC0+IHJhaXNlIE5vdF9mb3VuZAogIHwgU29tZSB4IC0+ IHgKCmxldCBwZiA9IFByaW50Zi5wcmludGYKCmxldCBzcGxpdF9hdCBjIHUgPQogIGxldCBt ID0gU3RyaW5nLmxlbmd0aCB1IGluCiAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIG0gaW4KICBs ZXQgcmVjIGxvb3AwIHIgaSA9CiAgICBpZiBpID49IG0gdGhlbgogICAgICBMaXN0LnJldiBy CiAgICBlbHNlCiAgICAgIGlmIHUuW2ldID0gYyB0aGVuCiAgICAgICAgbG9vcDAgciAoaSAr IDEpCiAgICAgIGVsc2UKICAgICAgICBsb29wMSByIGkKICBhbmQgbG9vcDEgciBpID0KICAg IGlmIGkgPSBtIG9yIHUuW2ldID0gYyB0aGVuCiAgICAgIGJlZ2luCiAgICAgICAgbGV0IHgg PSBCdWZmZXIuY29udGVudHMgYiBpbgogICAgICAgIEJ1ZmZlci5jbGVhciBiOwogICAgICAg IGxvb3AwICh4OjpyKSAoaSArIDEpCiAgICAgIGVuZAogICAgZWxzZQogICAgICBiZWdpbgog ICAgICAgIEJ1ZmZlci5hZGRfY2hhciBiIHUuW2ldOwogICAgICAgIGxvb3AxIHIgKGkgKyAx KQogICAgICBlbmQKICBpbgogIGxvb3AwIFtdIDAKCmxldCAoICYgKSBmIHggPSBmIHgKCmNs YXNzIFsnc3ViamVjdF0gaW8gaW5fY2hhbm5lbCAoKSA9CiAgb2JqZWN0CiAgICB2YWwgbXV0 YWJsZSBzdWJqZWN0IDogJ3N1YmplY3Qgb3B0aW9uID0gTm9uZQogICAgbWV0aG9kIHNldF9z dWJqZWN0IHMgPSBzdWJqZWN0IDwtIFNvbWUgcwogICAgbWV0aG9kIGdldF9zdWJqZWN0ID0g bWFuZGF0b3J5IHN1YmplY3QKICAgIAogICAgbWV0aG9kIHJlYWQgPQogICAgICBwZiAiPCAl ISI7CiAgICAgIHNwbGl0X2F0ICcgJyAmIGlucHV0X2xpbmUgaW5fY2hhbm5lbAoKICAgIG1l dGhvZCB3cml0ZSB1ID0KICAgICAgcGYgIj4+PiAlc1xuJSEiIHUKICBlbmQKCmNsYXNzIHZp cnR1YWwgY29tbWFuZCA9CiAgb2JqZWN0CiAgICBtZXRob2QgdmlydHVhbCBnZXRfdmVyYiA6 IHN0cmluZwogICAgbWV0aG9kIHZpcnR1YWwgcGVyZm9ybSA6IHN0cmluZyBsaXN0IC0+IHVu aXQKICBlbmQKCmNsYXNzIHZpcnR1YWwgZGVzY3JpYmFibGUgPQogIG9iamVjdAogICAgbWV0 aG9kIHZpcnR1YWwgZGVzY3JpYmUgOiAnYSAuICdhIGlvIC0+IHVuaXQKICAgIG1ldGhvZCB2 aXJ0dWFsIGdldF9uYW1lIDogc3RyaW5nCiAgZW5kCgpjbGFzcyB2aXJ0dWFsIHBoeXNpY2Fs ID0KICBvYmplY3Qoc2VsZikKICAgIGluaGVyaXQgZGVzY3JpYmFibGUgYXMgc3VwZXIKICAg IHZhbCBtYXNzID0gMS4wCiAgICB2YWwgdGFrZWFibGUgPSB0cnVlCiAgICB2YWwgbXV0YWJs ZSBjb250ZW50cyA6IHBoeXNpY2FsIGxpc3QgPSBbXQogICAgdmFsIG11dGFibGUgY29udGFp bmVyIDogcGh5c2ljYWwgb3B0aW9uID0gTm9uZQogICAgbWV0aG9kIGNvbnRlbnRzID0gY29u dGVudHMKICAgIG1ldGhvZCBjb250YWluZXIgPSBtYW5kYXRvcnkgY29udGFpbmVyCgogICAg bWV0aG9kIGFkZCA6IHBoeXNpY2FsIC0+IHVuaXQgPSBmdW4gdGhpbmcgLT4gY29udGVudHMg PC0gdGhpbmcgOjogY29udGVudHMKCiAgICBtZXRob2QgcmVtb3ZlICh0aGluZyA6IHBoeXNp Y2FsKSA9IGNvbnRlbnRzIDwtIExpc3QuZmlsdGVyICgoPD4pIHRoaW5nKSBjb250ZW50cwoK ICAgIG1ldGhvZCB1bmxpbmsgPQogICAgICBtYXRjaCBjb250YWluZXIgd2l0aAogICAgICB8 IE5vbmUgLT4gKCkKICAgICAgfCBTb21lIHQgLT4gdCNyZW1vdmUgKHNlbGYgOj4gcGh5c2lj YWwpCgogICAgbWV0aG9kIHB1dCAodGFyZ2V0IDogcGh5c2ljYWwpID0KICAgICAgc2VsZiN1 bmxpbms7CiAgICAgIGNvbnRhaW5lciA8LSBTb21lIHRhcmdldDsKICAgICAgdGFyZ2V0I2Fk ZCAoc2VsZiA6PiBwaHlzaWNhbCkKICAgICAgCiAgZW5kCgpjbGFzcyBiaXNjdWl0ID0KICBv YmplY3QKICAgIGluaGVyaXQgcGh5c2ljYWwgYXMgc3VwZXIKICAgIG1ldGhvZCBkZXNjcmli ZSBpbyA9CiAgICAgIGlvI3dyaXRlICJBIHNxdWFyZSBiaXNjdWl0IHdpdGggY2hvY29sYXRl IGluIGl0LiAgSXQgaXMgb3JnYW5pYywgb3IgYXQgbGVhc3QgdGhhdCdzIHdoYXQgdGhlIHdy aXRpbmcgb24gaXQsIHByZXN1bWFibHkgaW4gZWRpYmxlLCBvcmdhbmljIGluaywgc2F5cy4i OwogICAgbWV0aG9kIGdldF9uYW1lID0gImEgY2hvY29sYXRlIGJpc2N1aXQiCiAgICBtZXRo b2QgdG9fc3RyaW5nID0gInRoZSBiaXNjdWl0IgogIGVuZAoKdHlwZSBkaXJlY3Rpb24gPSBO IHwgUyB8IEUgfCBXCgpsZXQgaW52ZXJ0ID0gZnVuY3Rpb24KfCBOIC0+IFMKfCBTIC0+IE4K fCBFIC0+IFcKfCBXIC0+IEUKCmxldCBjb25uZWN0IHAxIGQgcDIgPQogIHAxI2Nvbm5lY3Qg ZCBwMjsKICBwMiNjb25uZWN0IChpbnZlcnQgZCkgcDEKCmNsYXNzIHZpcnR1YWwgcGxhY2Ug PQogIG9iamVjdChzZWxmKQogICAgaW5oZXJpdCBwaHlzaWNhbCBhcyBzdXBlcgogICAgdmFs IG11dGFibGUgc2VlbiA9IGZhbHNlCiAgICB2YWwgbXV0YWJsZSBvdXRsaW5rcyA6IChkaXJl Y3Rpb24gKiBwbGFjZSkgbGlzdCA9IFtdCgogICAgbWV0aG9kIGdvIGQgPSBMaXN0LmFzc29j IGQgb3V0bGlua3MKCiAgICBtZXRob2QgY29ubmVjdCBkIHQgPSBvdXRsaW5rcyA8LSAoZCwg dCkgOjogb3V0bGlua3MKCiAgICBtZXRob2QgZGVzY3JpYmVfaXRlbXMgOiAnYSAuICdhIGlv IC0+IHVuaXQgPSBmdW4gaW8gLT4KICAgICAgaW8jd3JpdGUgIllvdSBjYW4gc2VlOiI7CiAg ICAgIExpc3QuaXRlcgogICAgICAgIChmdW4gcCAtPgogICAgICAgICAgbGV0IChxIDogcGh5 c2ljYWwpID0gcCBpbgogICAgICAgICAgcSNkZXNjcmliZSBpbwogICAgICAgICkKICAgICAg ICBjb250ZW50cwoKICAgIG1ldGhvZCB2aXJ0dWFsIGRlc2NyaWJlX3BsYWNlIDogJ2EgLiAn YSBpbyAtPiB1bml0CgogICAgbWV0aG9kIGRlc2NyaWJlIGlvID0KICAgICAgc2VsZiNkZXNj cmliZV9wbGFjZSBpbzsKICAgICAgc2VsZiNkZXNjcmliZV9pdGVtcyBpbwogIGVuZAoKY2xh c3MgdmlydHVhbCBwZXJzb24gPQogIG9iamVjdAogICAgaW5oZXJpdCBwaHlzaWNhbCBhcyBz dXBlcgogICAgdmFsIHRha2VhYmxlID0gZmFsc2UKICBlbmQKCmNsYXNzIGhlcm8gPQogIG9i amVjdAogICAgaW5oZXJpdCBwZXJzb24gYXMgc3VwZXIKICAgIG1ldGhvZCBnZXRfbmFtZSA9 ICJKb2huIgogICAgbWV0aG9kIGRlc2NyaWJlIGlvID0gaW8jd3JpdGUgIkpvaG4gaXMgYSB0 YWxsIG1hbi4iCiAgZW5kCgpsZXQgc2YgPSBQcmludGYuc3ByaW50ZgoKY2xhc3MgZm9yZXN0 IG5hbWUgKCkgPQogIG9iamVjdChzZWxmKQogICAgaW5oZXJpdCBwbGFjZSBhcyBzdXBlcgog ICAgbWV0aG9kIGdldF9uYW1lID0gbmFtZQogICAgbWV0aG9kIGRlc2NyaWJlX3BsYWNlIGlv ID0KICAgICAgaW8jd3JpdGUgKHNmICJZb3UgYXJlIGluICVzIiBzZWxmI2dldF9uYW1lKQog IGVuZAoKY2xhc3Mgc3dvcmQgPQogIG9iamVjdChzZWxmKQogICAgaW5oZXJpdCBwaHlzaWNh bCBhcyBzdXBlcgoKICAgIG1ldGhvZCBkZXNjcmliZSBpbyA9CiAgICAgIGlvI3dyaXRlICJB IG9uZS1tZXRlciBsb25nLCB0aXRhbml1bSBhbGxveSwgZ29sZC1wbGF0ZWQsIGVtZXJhbGQt aW5jcnVzdGVkLCBEcmFnb24tcmVwZWxsaW5nIGFkdmVudHVyZXIncyBoZWF2eSBkdXR5IHN3 b3JkLiIKCiAgICBtZXRob2QgZ2V0X25hbWUgPSAiQSBnb2xkZW4gc3dvcmQiCiAgZW5kCgpj bGFzcyBnYW1lIGlvID0KICBsZXQgZjEgPSBuZXcgZm9yZXN0ICJ0aGUgYmlnIGRhcmsgZm9y ZXN0IiAoKSBpbgogIGxldCBmMiA9IG5ldyBmb3Jlc3QgInRoZSBzbWFsbCBkYXJrIGZvcmVz dCIgKCkgaW4KICBsZXQgZjMgPSBuZXcgZm9yZXN0ICJ0aGUgc21hbGwgbGlnaHQgZm9yZXN0 IiAoKSBpbgogIGxldCBmNCA9IG5ldyBmb3Jlc3QgInRoZSB0cm9waWNhbCBmb3Jlc3QiICgp IGluCiAgbGV0IGggID0gbmV3IGhlcm8gaW4KICBsZXQgXyA9IGgjcHV0IChmMSA6PiBwaHlz aWNhbCkgaW4KICBsZXQgXyA9IGNvbm5lY3QgZjEgTiBmMiBpbgogIGxldCBfID0gY29ubmVj dCBmMiBFIGYzIGluCiAgbGV0IF8gPSBjb25uZWN0IGYzIFMgZjQgaW4KICBsZXQgXyA9IGNv bm5lY3QgZjQgRSBmMSBpbgogIGxldCBfID0gaW8jc2V0X3N1YmplY3QgaCBpbgogIGxldCBz dyA9IG5ldyBzd29yZCBpbgogIGxldCBfID0gc3cjcHV0IChmMSA6PiBwaHlzaWNhbCkgaW4K ICBsZXQgYiA9IG5ldyBiaXNjdWl0IGluCiAgbGV0IF8gPSBiI3B1dCAoZjQgOj4gcGh5c2lj YWwpIGluCiAgb2JqZWN0KHNlbGYpCiAgICBtZXRob2Qgd2hlcmUgPQogICAgICBsZXQgd2gn ID0gaCNjb250YWluZXIgaW4KICAgICAgKCogWFhYWFhYWFggaGVyZSAqKQogICAgICBsZXQg d2ggOiBwbGFjZSA9IE9iai5tYWdpYyB3aCcgaW4gKCogSSdkIGxpa2UgYSBkeW5hbWljIGNh c3QgaGVyZSEgKikKICAgICAgKCogWFhYWFhYWFggKikKICAgICAgKCpsZXQgd2gnID0gKGgj Y29udGFpbmVyIDogcGh5c2ljYWwgPDogcGxhY2UpIGluKikKICAgICAgd2gKCiAgICBtZXRo b2QgZ28gZCA9CiAgICAgIHRyeQogICAgICAgIGxldCB3aCA9IHNlbGYjd2hlcmUgaW4KICAg ICAgICBsZXQgd2ggPSB3aCNnbyBkIGluCiAgICAgICAgaCNwdXQgKHdoIDogcGxhY2UgOj4g cGh5c2ljYWwpCiAgICAgIHdpdGgKICAgICAgfCBOb3RfZm91bmQgLT4KICAgICAgICAgIGlv I3dyaXRlICJDYW4ndCBnbyB0aGVyZSIKICAgICAgCiAgICBtZXRob2QgcnVuID0KICAgICAg bGV0IHdoID0gc2VsZiN3aGVyZSBpbgogICAgICB3aCNkZXNjcmliZSBpbzsKICAgICAgYmVn aW4KICAgICAgICBtYXRjaCBpbyNyZWFkIHdpdGgKICAgICAgICB8IFsibiJdIC0+IHNlbGYj Z28gTgogICAgICAgIHwgWyJzIl0gLT4gc2VsZiNnbyBTCiAgICAgICAgfCBbImUiXSAtPiBz ZWxmI2dvIEUKICAgICAgICB8IFsidyJdIC0+IHNlbGYjZ28gVwogICAgICAgIHwgXyAtPiBp byN3cml0ZSAiV3RmPyIKICAgICAgZW5kCiAgZW5kCgpsZXQgcGxheSAoKSA9CiAgbGV0IGlv ID0gbmV3IGlvIHN0ZGluICgpIGluCiAgbGV0IGcgPSBuZXcgZ2FtZSBpbyBpbgogIHdoaWxl IHRydWUgZG8KICAgIGcjcnVuCiAgZG9uZQo= --------------090803070103080003010205--