lpc - types - function

MudOS v21c2

function


һ����� :

MudOS ��һ�ֳ�Ϊ function�� (����ָ��) �ı�������. �������͵ı�����������ָ����ֲ�ͬ�ĺ���. ��Ҳ��������Ϥ��һ����������ijЩ�ⲿ���� (efuns)�� ����. ������˵, ���ǹ���������ⲿ����. ������һ������, ������һ���������������е�Ԫ��. �ô˺������ط���ֵ (non-zero) ��Ԫ�ؾͱ�������, �������һ���µ�����. ��ͳ��, ������Ҫ����һ������ͺ���������. ����, �����ú���ָ�����ֱ�����������. ����ָ��ֻ����һ����������Ϣ, �������Ժ�ִ���亯��.

����ָ����Դ��첢ָ��Ϊ����:

    function f = (: local_func :);
����� f�� �������������������̻��ⲿ������, ��ͬ��ͨ�ı���ֵ:
    foo(f);�� map_array( ({ 1, 2 }), f);
�����Ժ���ִ�� f:
    x = evaluate(f, "hi");
��һ��ִ��ʱ, ����� f�� ָ��ĺ���, �� "hi" ���ɲ������뺯��. ��Ч��ͬ��:
    x = local_func("hi");
ʹ�ú���ָ��ĺô���, �������ʹ�ò�ͬ�ĺ���, ֻ��Ҫ�ı亯��ָ�������ֵ.

ע�� evaluate() �IJ���������Ǻ���, ��ֻ�᷵�ز���ֵ. ���������������µ�
��:

    void set_short(mixed x) { short = x; }
    mixed query_short() { return evaluate(short); }
����, �򵥵��������ֻ�� set_short("Whatever"); �Դ��
set_short( (: short_func :) ); ����.


Ŀǰ����ָ������� :

��򵥵ĺ���ָ������������. ֻ�Ǽ򵥵�ָ��ͬһ������е�һ���ֲ����� (local function), �� (: function_name :). ����ָ���ֵ���԰��������IJ���, ����:

    string foo( string a, string b ) {
      return "(" + a "," + b + ")";
    }
    void create() {
      function f = (: foo, "left" :);
      printf( "%s %s\n", evaluate(f), evaluate(f, "right") );
    }
��ӡ��: (left,0) (left,right)


�ڶ��ֵĺ���ָ�����ⲿ����ָ��, ���� (: efun_name :). ������ֲ�����ָ�������. Ʃ��˵, objects() �ⲿ����Ҫ���뺯��, �������κ�ʹ����Ϊ��ֵ�����. ����:

    objects( (: clonep :) )
�᷵����Ϸ�����еĸ������ (clones). ��Ҳ����ʹ�ò���:
��
    void create() {
      int i;
      function f = (: write, "Hello, world!\n" :);

      for (i=0; i<3; i++) { evaluate(f); }

    }
�ͻ�ӡ��:

Hello, world!
Hello, world!
Hello, world!

ע��, �Ժ���ָ����˵, simul_efuns�� (ģ���ⲿ����) ���ⲿ��������ͬ��.


��������ʽ�� call_other ����ָ��, ����ǰ MudOS�� ��ʹ�õĺ���ָ����������. ����ʽΪ (: object, function :).�� Ҫʹ�ò����Ļ�, Ӧ��������������������鲢��. �����Ƿ���:
��

    void create()
    {
      string *ret;
      function f = (: this_player(), "query" :);

      ret = map( ({ "name", "short", "long" }), f );
      write(implode(ret, "\n"));

    }
������ӡ���� this_player()->query("name"), this_player()->query("short"),
�� this_player()->query("long") ��ͬ�Ľ��.

Ҫʹһ������ָ��ֱ�ӵ��� query("short") :

    f = (: this_player(), ({ "query", "short" }) :)
�����Ǵﵽͬ��Ŀ�ĵ������ο�:
    f = (: call_other, this_player(), "query", "short" :)�������������� /* һ���ⲿ����ָ��, ʹ�� call_other */
    f = (: this_player()->query("short") :)�������������� // ��Ч������ʽ; �������.

��������ʽ������ʽ (expression) ����ָ��. ���� (: ����ʽ :).�� ��һ������ʽ����ָ����, ���������� $1, $2, $3 ... ����, ��������:

    evaluate( (: $1 + $2 :), 3, 4)�������������� // ���� 7.
��������� sort_array, ��������:
    top_ten = sort_array( player_list,
      (: $2->query_level() - $1->query_level :) )[0..9];


��������ʽ�Dz�֪�� (anonymous)�� ����:
��
    void create() {
      function f = function(int x) {
        int y;

        switch(x) {

          case 1: y = 3;
          case 2: y = 5;
        }
        return y - 2;

      ������ };

      printf("%i %i %i\n", (*f)(1), (*f)(2), (*f)(3));

    }
��ӡ��: 1 3 -2

ע��, (*f)(...) ���� evaluate(f, ...) , ���������﷨��Ϊ����ɰ�����. �κ���ͨ�����Ϸ� (legal)�� ��д��, ���������ڲ�֪������.


ʲôʱ��ִ�� (evaluate) ���� ?

������в������ⲿ�������ֲ�������ģ���ⲿ����ָ��ʱ, ��ִ�к���. ������ʽ�͹����� (functional) ����ָ��, ֻ����ʹ�ú���ָ��ʱִ�к���:

    (: destruct, this_player() :)�������������� /* �����������ָ��ʱ, �ͻ�ݻ� this_player(). �����ڴ���ʱִ��. */
    (: destruct(this_player()) :)�������������� /* ���Ժ�ʹ�ô˺���ָ��ʱ, �Ż�ݻ� this_player()" */
�ڴ�, ������������ʽ����ָ����, ʹ��һ���ֲ�����. ��Ϊִ���������ָ��֮��, ����ֲ������Ͳ�������. ���ǿ�������������������:
    (: destruct( $(this_player) ) :)�������������� // �������һ��������ͬ.
$(whatever) ��ʾҪִ�� whatever, ��������ֵ. ��ִ�д˺���ʱ, �ٴ������ֵ. ����һ�����Ը���Ч��:
    map_array(listeners,
      (: tell_object($1, $(this_player()->query_name()) + " bows.\n") :) );
ֻ��һ�� call_other , ������Ҫÿ����Ϣ����. Ҳ�������Ⱥϲ��ַ���:
    map_array(listeners,
      (: tell_object($1, $(this_player()->query_name() + " bows.\n")) :) );
ע��, �����������, Ҳ����������:
    map_array(listeners,
      (: tell_object, this_player()->query_name() + " bows.\n" :) );

����: Spock @ FF 97.Aug.10.

�ص���һҳ