function
MudOS ��һ�ֳ�Ϊ function�� (����ָ��) �ı�������. �������͵ı�����������ָ����ֲ�ͬ�ĺ���. ��Ҳ��������Ϥ��һ����������ijЩ�ⲿ���� (efuns)�� ����. ������˵, ���ǹ���������ⲿ����. ������һ������, ������һ���������������е�Ԫ��. �ô˺������ط���ֵ (non-zero) ��Ԫ�ؾͱ�������, �������һ���µ�����. ��ͳ��, ������Ҫ����һ������ͺ���������. ����, �����ú���ָ�����ֱ�����������. ����ָ��ֻ����һ����������Ϣ, �������Ժ�ִ���亯��.
����ָ����Դ��첢ָ��Ϊ����:
- function f = (: local_func :);
- foo(f);�� map_array( ({ 1, 2 }), f);
- x = evaluate(f, "hi");
- x = local_func("hi");
ע�� evaluate() �IJ���������Ǻ���, ��ֻ�᷵�ز���ֵ. ���������������µ�
��:
- void set_short(mixed x) { short = x; }
mixed query_short() { return evaluate(short); }
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") );
�ڶ��ֵĺ���ָ�����ⲿ����ָ��, ���� (: efun_name :). ������ֲ�����ָ�������. Ʃ��˵, objects() �ⲿ����Ҫ���뺯��, �������κ�ʹ����Ϊ��ֵ�����. ����:
- objects( (: clonep :) )
��
- 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("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.
- 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));
ע��, (*f)(...) ���� evaluate(f, ...) , �����������Ϊ����ɰ�����. �κ���ͨ�����Ϸ� (legal)�� ��д��, ���������ڲ�֪������.
������в������ⲿ�������ֲ�������ģ���ⲿ����ָ��ʱ, ��ִ�к���. ������ʽ������ (functional) ����ָ��, ֻ����ʹ�ú���ָ��ʱִ�к���:
- (: destruct, this_player() :)�������������� /*
�����������ָ��ʱ, �ͻ�ݻ� this_player(). �����ڴ���ʱִ��. */
(: destruct(this_player()) :)�������������� /* ���Ժ�ʹ�ô˺���ָ��ʱ, �Ż�ݻ� this_player()" */
- (: destruct( $(this_player) ) :)��������������
// �������һ��������ͬ.
- map_array(listeners,
- (: tell_object($1, $(this_player()->query_name())
+ " bows.\n") :) );
- 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.