Introduction

So-o définit une couche fonctionnelle qui ajoute un modèle de programmation orientée objet à un langage de programmation structurée. Inspiré par Smalltalk, fruit d'un longue pratique d'Objective C et de différents dialectes du Lisp, So-o est complet, simple et léger, facile à comprendre.

Implémentation

So-o a 3 fonctions : defclass qui définit une nouvelle classe, sendmsg qui sert systématiquement à envoyer un message à une classe ou à une instance, et supersend qui exécute une méthode héritée d'une superclasse. Simply object-oriented !

So-o propose une implémentation type en plusieurs langages. Le code en PHP a moins de 1000 lignes. Le code en C tient en quelque 1500 lignes. Le code en JavaScript fait à peine 700 lignes.

Exemple

namespace Hello;

require_once 'So-o.php';

defclass('Hello', null, 1, null, null, null, array('hello'));

function i_hello($self) {
    echo 'Hello from So-o!', PHP_EOL;

    return $self;
}

Définit la classe Hello qui a un message d'instance : hello. La fonction i_hello implémente la méthode.

$ php -a
php > require_once 'Hello.php';
php > $hello=sendmsg($Hello, 'new');
php > sendmsg($hello, 'hello');
Hello from So-o!

Une partie de poker • Un programme complet écrit en PHP avec So-o.

Lire le manuel PHP

Exemple

#include "So-o.h"

class Hello;

static instance i_hello(instance self) {
    printf( "Hello from So-o!\n" );

    return self;
}

void defclassHello() {
    selector _i_messages[] = {
        "hello",    METHOD(i_hello),
        0, 0
    };

    Hello = defclass("Hello", 0, 1, 0, 0, 0, _i_messages);
}

Un simple main pour illustrer l'utilisation de la classe Hello :

#include "So-o.h"

#include <stdlib.h>

extern class Hello;

extern void defclassHello();

int main( int argc, char *argv[] ) {
    instance hello;

    defclassHello();

    hello = (instance)sendmsg(Hello, "new").p;

    sendmsg(hello, "hello");

    sendmsg(hello, "free");

    exit( 0 );
}
$ gcc -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c test-Hello.c
$ gcc -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c Hello.c
$ gcc test-Hello.o Hello.o libso-o.a -o test-Hello
$ test-Hello
Hello from So-o!

Une partie de poker • Un programme complet écrit en C avec So-o.

Lire le manuel C

Exemple

import { defclass } from 'So-o';

defclass('Hello', null, 1,
    null,
    null,
    null,
    {   'hello':    (self) => {
                        console.log('Hello from So-o!');
                       
                        return self;
                    }
    }
);

Quelques lignes de code pour illustrer l'utilisation de la classe Hello :

import { sendmsg } from 'So-o';

import 'Hello';

var hello = sendmsg(Hello, 'new');

sendmsg(hello, 'hello');
$ ln Hello.js node_modules/Hello.mjs
$ ln testHello.js testHello.mjs
$ nodejs --experimental-modules testHello
Hello from So-o!

Une partie de poker • Un programme complet écrit en JavaScript avec So-o.

Lire le manuel JavaScript