�I�u�W�F�N�g�ƃN���[�W��

���̂���̌���̓I�u�W�F�N�g�w���łȂ���� ����Ƃ��ĔF�߂Ă��炦�Ȃ��悤�ȋC�z���������肷��̂ŁA crowbar�ɂ��I�u�W�F�N�g��g�ݍ��ނ��Ƃɂ��܂��B

���Acrowbar�̃I�u�W�F�N�g�w���́A C++��Java�̂���Ƃ͂�����Ƃ΂����Ⴂ�܂��B �Ȃɂ���N���X������܂���B

�ł͋�̓I�ɂǂ�Ȏd�l�Ǝ����ɂȂ��Ă���̂��A����͂����������܂��B

GLOBAL�����܂����\�[�X�� ����������Q�Ɖ”\�ł��B

�_�E�����[�h�́AUNIX�ł��������A Windows�ł��������B

�ׂ����s��C����S�o�[�W�����ɑ΂��čs���̂͑�ςł��̂ŁA ver.0.3�n���ver.0.3.01�ɓ������܂����B ��������Q�Ƃ��Ă��������B

�I�u�W�F�N�g

crowbar�ł́A�z��̐����̓l�C�e�B�u�֐�new_array()���g���܂����A ���l�ɁA�I�u�W�F�N�g�̓l�C�e�B�u�֐�new_object()���g�p���܂��B

 o = new_object();

C�̍\���̂Ɠ����悤�ɁAcrowbar�̃I�u�W�F�N�g�������o�������܂��B �����A�^�̐錾���Ȃ��̂ŁA�����o�́A����ɂ����s���ɒlj�����܂��B

 o = new_object();
 o.hoge = 10;
 o.piyo = 20;
 print("o.hoge.." + o.hoge + "o.piyo.." + o.piyo + "\n");

�^�錾���Ȃ��̂͋C�����������A �Ƃ����l������ł��傤��(���₻�̎������̂ЂƂ�Ȃ̂ł���)�A �ЂƂ܂�����ŁAC�̍\���̂Ɏ������Ƃ͎����ł��܂��B

�Ȃ��AJava�ȂǂƓ��l�A�I�u�W�F�N�g�͎Q�ƌ^�ł���A new_object()�ŕԂ����̂̓I�u�W�F�N�g�ւ̎Q�Ƃł��B ����āA�ȉ��̃R�[�h��20��\�����܂��B

  o1 = new_object();
  o1.hoge = 10;
  o2 = o1;
  o2.hoge = 20;
  print(o1.hoge);

�u�I�u�W�F�N�g�v�Ƃ����p��ɂ‚���

�O����GC�̐����ł́A �������z��Ƃ������Q�ƌ^�̃f�[�^���A �܂Ƃ߂āu�I�u�W�F�N�g�v�ƌĂ�ł��܂����B �����āA�����̌^��\�����邽�߂ɁA CRB_Object�Ƃ����\���̂���������Ă��܂��B

���A����́Anew_object()�Ő�������郂�m�̂��Ƃ��w���� �u�I�u�W�F�N�g�v�ƌĂ�ł��܂��B

���̂�����A�p�ꂪ�������Ă���킯�ł����A ���ɓK�؂Ȍ��t���v���‚��Ȃ��������̂Ł\�\���݂܂���B

�Ƃ����킯�ŁA�p�ꂪ�������Ă���̂͑f���ɔF�߂�Ƃ��āA ����ǂ̂悤�Ɍ��t���g�������Ă������ł����A

�Ƃ������Ƃɂ��悤�Ǝv���܂��B

�ł́A�����ґ��́A�unew_object()�Ő��������\���̂̂悤�Ȃ��́v�� ���ƌĂׂΗǂ��̂��A�Ƃ������ƂɂȂ�܂����A �����ł́uassoc�v�ƌĂԂ��Ƃɂ��܂��B �uassoc�v�Ƃ����̂͘A�z�z��(associative array)�̗��ł��B ��������L�[�ɒl�����o����A�Ƃ����_�ɂ����āA crowbar�̃I�u�W�F�N�g�͌��ǂ̂Ƃ���A�z�z�񂾂���ł� ��1�B

�I�u�W�F�N�g�̎����ɂ‚���

�I�u�W�F�N�g(�����җp���assoc)�́A �Q�ƌ^�ł�����A�z��╶����Ɠ��l�A CRB_Object�̋��p�̂̃����o�Ƃ��ĕێ����܂��B ���R�A�Ή�����񋓌^���K�v�ł��B

typedef enum {
    ARRAY_OBJECT = 1,
    STRING_OBJECT,
    ASSOC_OBJECT,
    SCOPE_CHAIN_OBJECT,
    OBJECT_TYPE_COUNT_PLUS_1
} ObjectType;

�c

struct CRB_Object_tag {
    ObjectType  type;
    unsigned int        marked:1;
    union {
        CRB_Array       array;
        CRB_String      string;
        CRB_Assoc       assoc;
        ScopeChain      scope_chain;
    } u;
    struct CRB_Object_tag *prev;
    struct CRB_Object_tag *next;
};

�Ȃɂ��uSCOPE_CHAIN�v�Ƃ������̂������Ă��܂����A����ɂ‚��Ă͌�q�B

�����āACRB_Assoc���̂��̂̒�`�́A�ȉ��̂悤�ɂȂ�܂��B

typedef struct {
    char        *name;
    CRB_Value   value;
} AssocMember;

struct CRB_Assoc_tag {
    int         member_count;
    AssocMember *member;
};

�Ȃ�̂��Ƃ͂���܂���B�u�����o�v�Ƃ����͖̂��O�ƒl�̑g�ŁA assoc�́A������•ϒ��z��ŕێ����Ă���A�Ƃ��������ł��B

���Ȃ݂Ɍ���̎����ł́A�����o���lj������x�� realloc()�łЂƂ‚��—v�f�𑝂₵�Ă��܂����A �V�K�v�f�͉•ϒ��z��̖����ɒlj�����܂��B �����̓��j�A�T�[�`�ł�(�܁A�x���I�v���O���~���O�Ƃ������Ƃ�)�B

assoc�𑀍삷��֐��Q��heap.c�ɗp�ӂ���Ă���A �ȉ��̂��̂�����܂��B

/* assoc�̐��� */
CRB_Object *crb_create_assoc(CRB_Interpreter *inter);
/* assoc�Ƀ����o��lj� */
void crb_add_assoc_member(CRB_Interpreter *inter, CRB_Object *assoc,
                          char *name, CRB_Value *value);
/* assoc�̃����o�����B���݂��Ȃ����NULL��Ԃ� */
CRB_Value *crb_search_assoc_member(CRB_Object *assoc, char *member_name);

���R�ł����Aassoc���lj����ꂽ���ƂŁAGC���C������K�v������܂��B GC��mark�t�F�[�Y�ɂ����āAassoc�̃����o�����ɒH��܂��B

�N���[�W��

�I�u�W�F�N�g�ƌ����̂Ȃ�f�[�^�����o��������Ȃ����\�b�h���v�邾�낤�A ���\�b�h�͂ǂ������A�Ƃ��������������Ă������ł����A ����͂��΂炭���u���āA�ʂ̘b��i�߂܂��B

crowbar�ł��N���[�W���Ƃ������̂��g�����Ƃ��ł��܂��B �N���[�W���Ƃ́A���̒��Œ�`�ł���֐��̂悤�Ȃ��̂ł��B

  # �N���[�W���̐���
  c = closure(a) {
      print("a.." + a);
  }

  # �N���[�W���̌Ăяo��
  c(10);

�uclosure�v�Ƃ����̂́A�N���[�W�������̂��߂̗\���ł��B ���̌��ɁA���ʂň͂񂾉������ƃu���b�N���������ƂŁA �N���[�W������������A�����ł͂����c�ɑ�����Ă��܂��B �uc(10)�v�̂悤�ɏ������ƂŁA������Ăяo�����Ƃ��ł��܂��B ����āA���̃R�[�h�́A�ua..10�v�ƕ\�����܂��B

C�v���O���}�Ȃ�A���������΁A�u�Ȃ񂾁A�֐��|�C���^�̂悤�Ȃ��̂��v �Ǝv���ł��傤(�܂��A�N���[�W���ɂ́A ���̒��łЂ�����菑����Ƃ�����y���͂���܂���)�B �N���[�W���́A�m���Ɋ֐��|�C���^�ɂ悭�������ʂ�����܂����A ���ہA�����悤�Ȏg���������܂��B

�������A����I�ɈႤ�̂́A�N���[�W���́A �N���[�W�����������ꂽ���̃��[�J���ϐ����Q�Ƃł���A�Ƃ������Ƃł��B

���Ƃ��āAforeach�ɂ‚��čl���Ă݂܂��B crowbar�Ŕz��̑S�v�f�ɂ‚��ă��[�v��������Έȉ��̂悤�ɏ����܂���

  for (i = 0; i < array.size(); i++) {
      # ����
  }

���̏������́A ���ꂪ�z��ł���Ƃ������ƂɈˑ����������ɂȂ��Ă��܂��Ă��܂��B �C���ς���Ĕz��ł͂Ȃ��A�����X�g�ɂ�����A ���̂悤�ȋL�q�����Ă�������ׂĂ𒼂��Ȃ���΂Ȃ�܂���B ����͌����Ƃ������ƂŁA���Ƃ���C#�ł́A foreach�Ƃ����\�����p�ӂ���Ă��܂��B

  foreach (Object o in hogeCollection)
  {
      // ����
  }

Java�ł��AJ2SE5.0���瓯��̍\�����lj�����܂����B

���̍\���͊m���ɕ֗��ł͂���܂����A �֗�������Ƃ����č\���K���ɂ܂Ŏ��������̂͂������Ȃ��̂��A �Ƃ����l����������ł��傤�B �������A�N���[�W�����g���錾��Ȃ�A ���Ƃ��Έȉ��̂悤�ɏ�����킯�ł� (�����crowbar�ł���������킯�ł͂Ȃ��̂Œ���)�B

  foreach(hoge_collection, closure(o) {
      # ����
  });

����foreach�͗\���ł͂Ȃ��A�P�Ȃ郉�C�u�����֐��ł��B ��1�����ɃR���N�V�����̃I�u�W�F�N�g���A ��2�����ɃN���[�W�����󂯎���Ă��܂��B foreach�֐����A�R���N�V�����Ɋi�[����Ă���v�f�����Ɏ��o���A ����������Ƃ��āA��2�����œn���ꂽ�N���[�W�����Ăяo���Ă����킯�ł��B

�P��foreach�֐�����Ăяo���Ă��炤�����Ȃ�A C�̊֐��|�C���^�ł������͉”\�ł��傤�B �������A���̂悤�Ȏg����������Ȃ�A���[�v�̓����ɂ����āA �O���̃��[�J���ϐ����Q�Ƃ������Ǝv���̂����ʂł͂Ȃ��ł��傤���B

  fp = fopen("hoge.txt", "w");
  foreach(hoge_collection, closure(o) {
      fputs(o.name, fp); # ���[�v�̊O���̕ϐ�fp���Q��
  });

�N���[�W���ł͂��ꂪ�”\�ł���A���̓_���A C�̊֐��|�C���^�Ƃ̌���I�ȈႢ�ł���킯�ł��B

���\�b�h

���āA�I�u�W�F�N�g�ƃN���[�W����g�ݍ��킹��ƁA �ȉ��̂悤�ȏ��������ł��邱�ƂɂȂ�܂��B

  1:  # �u�_�v�𐶐�����֐�(�R���X�g���N�^)
  2:  function create_point(x, y) {
  3:      this = new_object();
  4:      this.x = x;
  5:      this.y = y;
  6:  
  7:      # ���W��\�����郁�\�b�hprint()�̒�`
  8:      this.print = closure() {
  9:          print("(" + this.x + ", " + this.y + ")\n");
 10:      };
 11:  
 12:      # �ړ����郁�\�b�hmove()�̒�`
 13:      this.move = closure(x_vec, y_vec) {
 14:          this.x = this.x + x_vec;
 15:          this.y = this.y + y_vec;
 16:      };
 17:      return this;
 18:  }
 19:  
 20:  # �I�u�W�F�N�g�̐���
 21:  p = create_point(10, 20);
 22:  
 23:  # move()���\�b�h�̌Ăяo��
 24:  p.move(5, 3);
 25:  
 26:  # print()���\�b�h�̌Ăяo��
 27:  p.print();

crowbar�ɂ͓��Ɂu���\�b�h�v�Ƃ����@�\�͂Ȃ��̂ł����A �I�u�W�F�N�g�̃����o�ɃN���[�W�����i�[���邱�ƂŁA ���|����AJava��C++�̃��\�b�h�Ǝ����悤�Ȃ��̂������ł��܂��B

��L�́uthis�v�͗\���ł����ł�����܂���B �P�Ȃ�ϐ��ł��̂ŁA�ǂ�Ȗ��O�ł��悢�̂ł����A Java��C++�Ɋ��ꂽ�l�ɂ�this���킩��₷���̂ł͂Ȃ��ł��傤���B �|�C���g�́A�N���[�W���͂��̊O���̃��[�J���ϐ����Q�Ƃł���̂ŁA print()��move()�̓�������this���Q�Ƃł���A�Ƃ������Ƃł��B

�܂��A�|�������t�B�Y������������΁A�u�T�u�N���X�v�ɂāA �u�X�[�p�[�N���X�v�̃��\�b�h���㏑������΂悢�킯�ł��B �������crowbar�ɂ͂��������N���X���Ȃ��̂ŁA �u�X�[�p�[�N���X�v���u�T�u�N���X�v���A �g�����Ō��߂���̂ł����Ȃ��̂ł�����ǁB

function create_extended_point(x, y) {
    this = create_point(x, y);

    # print()���I�[�o�[���C�h
    this.print = closure() {
        print("**override** (" + this.x + ", " + this.y + ")\n");
    };

    return this;
}

�J�v�Z�������~������΁Ax��y��this�Ɋi�[�����ɁA �ȉ��̂悤��get_x()��get_y()�������΂悢�ł��傤�B ���̏ꏊ�̃N���[�W������́A�����A ���Ȃ킿���[�J���ϐ��ł���x��y���Q�Ƃł��邩��ł��B

function create_point(x, y) {
    this = new_object();

    this.print = closure() {
        print("(" + x + ", " + y + ")\n");
    };

    this.move = closure(x_vec, y_vec) {
        x = x + x_vec;
        y = y + y_vec;
    };

    # x��getter
    this.get_x = closure() {
        return x;
    };

    # y��getter
    this.get_y = closure() {
        return y;
    };

    return this;
}

���ꂪ�Acrowbar�ɂ�����OO�T�|�[�g�ł��B

�N���[�W���̎����ɂ‚���

��̃��X�g�����āA����ȋ^����������l������̂ł͂Ȃ��ł��傤���B

this���x���y���̓��[�J���ϐ��Ȃ񂾂���A �֐�create_point()�𔲂������_�ʼn������Ă��܂����낤�B

������N���[�W���̒����炻�̊O���̃��[�J���ϐ����Q�Ƃł���Ƃ͂����Ă��A �Ȃ��Ȃ��Ă��܂������͎̂Q�Ƃł��Ȃ��̂ł�?

�\�\�����Ƃ��ȋ^��ł����A���ꂪ�����Ȃ�Ȃ��̂��N���[�W���̖ʔ����Ƃ���ł��B

C�Ȃǂł́A���[�J���ϐ��̗̈�́A�֐��ɓ��������_�ŃX�^�b�N��Ɋm�ۂ���A �֐��𔲂����^�C�~���O�ʼn������܂��B ���̎��A�m��/��������ЂƂ����܂�̃��������t���[���ȂǂƌĂт܂��B

crowbar�ł��Aver.0.2�܂ł͖{���I�ɓ����ł� (�t���[�����X�^�b�N�ł͂Ȃ��q�[�v�Ɋm�ۂ���A�Ƃ���������)�B �Ƃ��낪��̗�ɂ����āAprint()��move()�Ƃ��������\�b�h�́A create_point()���Ƃ����ɏI��������ŌĂяo����A ���������̒���this�Ȃǂ��Q�Ƃ��Ă��܂��B ���܂łƓ����悤�ɁA�u�֐��𔲂�����t���[���͉�������v �Ƃ����K���ł́A����ɑΉ��ł��܂���B

�����crowbar�ł́A �t���[�����m�ۂ����^�C�~���O�͏]���ʂ�ł����A ��������^�C�~���O�́A�u�֐��𔲂������v�ł͂Ȃ��A �u�t���[���ւ̎Q�Ƃ��Ȃ��Ȃ������v�ł��B �‚܂�A�t���[���̉����GC���s�Ȃ��܂��B

�ł́A���ۂ̎������@���l���Ă݂܂��傤�B �܂��A�t���[���́A1��̊֐��Ăяo�����̃��[�J���ϐ��Q�̊i�[�ꏊ�ł����A ���[�J���ϐ��Q�Ƃ����̂́A �v�͕ϐ����Ƃ��̒l�������g�ݍ��킳�������̂ł�����A ���Ȃ�assoc���g���܂��B �‚܂�A�֐��Ăяo���̃^�C�~���O�ŁA�ЂƂ‚�assoc����������A ���[�J���ϐ��͂����Ɋi�[����邱�ƂɂȂ�킯�ł��B

�����ăN���[�W���ł����A�N���[�W���́A�֐��|�C���^�Ǝ��Ă��܂����A ���ꂪ�������ꂽ���̃��[�J���ϐ����Q�Ƃł���Ƃ�������������܂��B �����ŁA�N���[�W���́u�����v�ƌĂ�ł���̂́A �ȉ��̂悤�ȁA�\���closure���g�����N���[�W���̒�`���A ���s���ꂽ�^�C�~���O���w���܂��B

  this.print = closure() {
      print("(" + this.x + ", " + this.y + ")\n");
  };

closure�ȉ��̋L�q���u�N���[�W���v�Ƃ����l�𐶐����A �����this.print�ɑ�����Ă��܂��B �N���[�W���͒l�ł�����ACRB_Value�Ɋi�[�ł��Ȃ���΂Ȃ�܂���B ����āACRB_Value�̋��p�̒�`�̒��ɁA CRB_Closure��lj�����K�v������܂��B

typedef enum {
    CRB_BOOLEAN_VALUE = 1,
    CRB_INT_VALUE,
    CRB_DOUBLE_VALUE,
    CRB_STRING_VALUE,
    CRB_NATIVE_POINTER_VALUE,
    CRB_NULL_VALUE,
    CRB_ARRAY_VALUE,
    CRB_ASSOC_VALUE,
    CRB_CLOSURE_VALUE,
    CRB_FAKE_METHOD_VALUE
} CRB_ValueType;
�c
typedef struct {
    CRB_ValueType	type;
    union {
	CRB_Boolean	boolean_value;
	int		int_value;
	double		double_value;
	void		*native_pointer_value;
	CRB_Object	*object;
	CRB_Closure	closure;
	CRB_FakeMethod	fake_method;
    } u;
} CRB_Value;

�Ȃɂ��uFAKE_METHOD�v�Ƃ������̂������Ă܂����A ����ɂ‚��Ă͌�q(����Ȃ�΂���)�B

�����āA����CRB_Closure�̒�`�ł����A �N���[�W���́A�֐��|�C���^�ƁA���ꂪ�������ꂽ���̃t���[�����Q�Ƃł���A �Ƃ�����`���炷��΁A�ȉ��̂悤�ɂȂ肻���ȋC�����܂��B

typedef struct {
    CRB_FunctionDefinition *function;
    CRB_Object          *environment; /* �t���[����assoc���w�� */
} CRB_Closure;

�����ofunction�́A�֐���`�̎��̂ł���CRB_FunctionDefinition���w���܂��B ������environment��2�́A �N���[�W�����������ꂽ���̃t���[�����w�� �\�\�Ƃ������ƂɂȂ肻���ȋC�����܂����A �����ł����ЂƂl�����Ȃ���΂Ȃ�Ȃ����Ƃ�����܂��B ����́A�N���[�W���̓l�X�g���ł���A�Ƃ������Ƃł��B

  1:  function f() {
  2:      a = 10;
  3:      c1 = closure() {
  4:          b = 20;
  5:          c2 = closure() {
  6:              # ���������a, b�̗������Q�Ƃ�����
  7:              print("a.." + a + "\n");
  8:              print("b.." + b + "\n");
  9:          };
 10:          c2();
 11:      };
 12:      return c1;
 13:  }
 14:  
 15:  c = f();
 16:  c();

��̃R�[�h�ŁA�����̃N���[�W���̓�������́A ���[�J���ϐ�a, b�̗������Q�Ƃł��Ȃ���΂Ȃ�Ȃ��ł��傤�B

���̗�Ō����΁A�܂�15�s�ڂ̌Ăяo���ɂ�� f()���Ăяo���ꂽ���_�Ńt���[�����ЂƂ�������A a�͂��̃t���[���Ɋi�[����܂��B �����āA3�`11�s�ڂ܂łŁA�N���[�W��c1����������A f()�͂��̃N���[�W����Ԃ��܂��B �܂�c1�͎��s����Ă��Ȃ��̂ŁA�N���[�W��c2�͐�������Ă��܂���B

���ɁA16�s�ڂ̌Ăяo���ɂ��A�N���[�W��c1���Ăяo����A ���̌Ăяo���ɂ������ЂƂ‚̃t���[������������܂��B b�͂�����̃t���[���Ɋi�[����邱�ƂɂȂ�܂��B �����āA�N���[�W��c2�����������킯�ł����A ���̒�����́A �ʁX�̃t���[���Ɋi�[����Ă���a��b�𗼕��Ƃ��Q�Ƃ������킯�ł��B

�������񂪂炪���Ă������ł����A�ЂƂ܂������邱�Ƃ́A �u���[�J���ϐ����Q�Ƃ���ۂ́A �ЂƂ‚̃t���[�����炾���T���΂悢�킯�ł͂Ȃ��A �����̃t���[�������ɒH���Č������Ȃ���΂Ȃ�Ȃ��v �Ƃ������Ƃł��B

�����ŁA�X�R�[�v�`�F�[���Ƃ����T�O�𓱓����܂��B �X�R�[�v�`�F�[���Ƃ́A �t���[���ƂȂ�assoc��A�����X�g�ŊǗ����邽�߂̂��̂ł��B

���̘A�����X�g���\�z���邽�߂ɁA ScopeChain�I�u�W�F�N�g�𓱓����܂��B ScopeChain�I�u�W�F�N�g��GC�̑ΏۂƂ������̂ŁA CRB_Object�̋��p�̂̃����o�Ƃ��܂�(��̕��� ��q����ƌ����������̂ЂƂ‚�����)�B ScopeChain�\���̂̒�`�͈ȉ��̒ʂ�ł��B

typedef struct {
    CRB_Object  *frame; /* CRB_Assoc���w�� */
    CRB_Object  *next;  /* ScopeChain���w�� */
} ScopeChain;

�����āACRB_Closure�́A�t���[����assoc�𒼐ڎw���̂ł͂Ȃ��A ScopeChain���w�����ƂɂȂ�܂��B

typedef struct {
    CRB_FunctionDefinition *function;
    CRB_Object          *environment; /* ScopeChain���w�� */
} CRB_Closure;

���₻�̃R�����g�ȊO�����ς���Ă��܂��� ��3�B

�܂��ALocalEnvironment�\���̂��A���l��ScopeChain���w�����ƂɂȂ�܂��B

�������̓I�ɂǂ̂悤�Ɏg���̂��́A ���ۂ̓�����ǂ��Ȃ���l����̂��킩��₷���ł��傤�B

���ۂ̓�����ǂ��Ă݂�

�Ƃ����킯�ŁA��ŋ������N���[�W���̃l�X�g�̃T���v�����x�[�X�ɁA ���ۂɃN���[�W�����ǂ̂悤�ɐ�������A �X�R�[�v���ǂ̂悤�ɕω����Ă����̂���ǂ��Ă݂܂��傤�B �ꉞ���X�g���Čf���܂��B ���ꂪ�{�Ȃ�y�[�W�҂��Ƃ��������̖��ʂƂ�������Ƃ���ł����A Web���ƁA�ʂ��قƂ�NjC�ɂ��Ȃ��Ă悢�Ƃ��낪�悢�ł��ȁB

  1:  function f() {
  2:      a = 10;
  3:      c1 = closure() {
  4:          b = 20;
  5:          c2 = closure() {
  6:              # ���������a, b�̗������Q�Ƃ�����
  7:              print("a.." + a + "\n");
  8:              print("b.." + b + "\n");
  9:          };
 10:          c2();
 11:      };
 12:      return c1;
 13:  }
 14:  
 15:  c = f();
 16:  c();
1.���ʂ̊֐��Ăяo��

�܂��A15�s�ڂ̌Ăяo���ɂ��f()���Ăяo���ꂽ���_�ŁA LocalEnvironment���ЂƂ—p�ӂ���A ���̐�Ƀt���[������������܂��B ���̂�����̓����͏]���̊֐��Ăяo���Ɠ����ƌ����Ă悢�ł��傤�B

�Ȃ��A�}��P���ɂ��邽�߂ɁA�}���ɂ�ScopeChain�I�u�W�F�N�g�͓o�ꂵ�܂���B �t���[����assoc���P�ƂŘA�����X�g���\�z�ł��邩�̂悤�ɕ`���Ă��܂��B

2.�N���[�W���̐���

���ɁA3�`11�s�ڂŃN���[�W������������܂��B

�N���[�W���́A �������ꂽ���_��LocalEnvironment���ێ����Ă���X�R�[�v�`�F�[���ւ� �Q�Ƃ�ێ����܂�(�K��1)�B

�Ȃ��Ac1���̃��[�J���ϐ��ł�����Aa�Ɠ����t���[���Ɋi�[�����̂ł����A �}��P���ɂ��邽�߂�����ȗ����܂��B

3.�N���[�W���̌Ăяo��

���ɁA16�s�ڂŃN���[�W��c1���Ăяo����܂��B

���̎����A�ʏ�̊֐��Ăяo���Ɠ��l�A �V����LocalEnvironment�ƃt���[�������̂ł����A ���̎��A�V�K�쐬�����t���[���̌��ɁA �N���[�W�����ێ����Ă����X�R�[�v�`�F�[����A�����܂�(�K��2)�B

���[�J���ϐ�����������ۂ́A LocalEnvironment���Q�Ƃ��Ă���X�R�[�v�`�F�[�������ɒH���Č������܂��B ����ɂ��Ac1�̒��ŁA���[�J���ϐ�a���Q�Ƃł���킯�ł��B

4.�N���[�W���̒��ł̃N���[�W���̐���

5�`9�s�ڂŁA�ӂ��‚߂̃N���[�W��c2�𐶐����Ă��܂��B

���̎菇�͑O��Ɠ��l�ŁA �N���[�W���́A �������ꂽ���_��LocalEnvironment���ێ����Ă���X�R�[�v�`�F�[���ւ� �Q�Ƃ�ێ����܂�(�K��1)����A c2�́Ab���i�[���ꂽ�t���[���A a���i�[���ꂽ�t���[����A�˂��X�R�[�v�`�F�[����ێ����邱�ƂɂȂ�܂��B

5.�l�X�g�����N���[�W���̌Ăяo��

�����āA10�s�ڂ�c2���Ăяo���ꂽ�ۂɂ́A �K��2�ɂ��A c2���Q�Ƃ��Ă����X�R�[�v�`�F�[�����V����LocalEnvironment�ɘA������܂�����A c2�̒������a��b�������Ƃ��Q�Ƃ��邱�Ƃ��ł���킯�ł��B

�\���K��

�I�u�W�F�N�g�ƃN���[�W���̎����̂��߁A �\���K�����ȉ��̂悤�ɕύX���Ă��܂��B

postfix_expression
        : primary_expression
        | postfix_expression LB expression RB
        | postfix_expression DOT IDENTIFIER /* �����o�Q�� */
        | postfix_expression LP argument_list RP /* �֐��Ăяo�� */
        | postfix_expression LP RP /* �����Ȃ��̊֐��Ăяo�� */
        | postfix_expression INCREMENT
        | postfix_expression DECREMENT
        ;

�I�u�W�F�N�g�̃����o�Q�Ƃ��A�V����postfix_expression�Ƃ��Ēlj����Ă��܂��B �܂��A�֐��Ăяo���ɂ‚��ẮA�]���͈ȉ��̂悤�ɒ�`����Ă��܂������A

primary_expression
        : IDENTIFIER LP argument_list RP
        | IDENTIFIER LP RP
	;

�N���[�W���̓����ɂ��A�Ăяo���Ώۂ�IDENTIFIER�Ƃ͌���Ȃ��Ȃ����̂ŁA postfix_expression�Ɉ��z���Ă��Ă��܂��B

�܂��A�N���[�W���̐����Ɋւ���\���͈ȉ��̒ʂ�ł��B

closure_definition
        : CLOSURE IDENTIFIER LP parameter_list RP block
        | CLOSURE IDENTIFIER LP RP block
        | CLOSURE LP parameter_list RP block
        | CLOSURE LP RP block
        ;

�����̂���Ȃ���2�ʂ�A �����closure�̌��ɖ��O��t���邩�ǂ�����2�ʂ�A 2�~2��4�ʂ�̍\������`����Ă��܂��B

�����܂ł̗�ł́A�N���[�W���ɂ͖��O��t���Ă��܂���ł����B ���O�t���̃N���[�W���͂ǂ̂悤�ȃP�[�X�Ŏg���̂��Ƃ����΁A �N���[�W���̒��Ŏ������g���ċA�Ăяo���������P�[�X�ł��B

������́A���O�t���̃N���[�W���́A ���̃N���[�W�����Ăяo����ĐV�����t���[�����������ꂽ���_�ŁA �N���[�W�����g���A ���̖��O�̃��[�J���ϐ��Ƃ��ēo�^���邱�ƂŎ������Ă��܂��B

��Lclosrue_definition����Acreate.c�ɂĈȉ��̍\���̂��쐬����܂��B

typedef struct {
    CRB_FunctionDefinition *function_definition;
} ClosureExpression;

�N���[�W����`�����CRB_FunctionDefinition���\�z�����킯�ł����A ����CRB_FunctionDefinition�́ACRB_Interpreter��function_list�ɂ͂‚Ȃ���܂���B ��͖؂�ClosureExpression����Q�Ƃ���Ă��邾���ł��B

���ʂ̊֐�

�\���K���̍��ł����������悤�ɁAver.0.2�܂ł�crowbar�ł́A �֐��Ăяo���͈ȉ��̂悤�ɒ�`����Ă��܂������A

primary_expression
        : IDENTIFIER LP argument_list RP
        | IDENTIFIER LP RP
        ;

����crowbar�ł́A�֐��Ăяo��������()�̍����ɂ́A IDENTIFIER�Ɍ��炸�C�ӂ̎����������Ƃ��ł���悤�ɂȂ�܂����B

���̂��߁A���ʂ̊֐����A�֐������N���[�W����Ԃ��悤�ɂȂ��Ă��܂��B ���Ƃ��΁uprint("hello\n")�v�Ƃ����Ăяo���́A �uprint�v�Ƃ������ʎq���N���[�W����Ԃ��A����ɑ΂���Ăяo���A �Ƃ����`�œ��삵�܂��B���̂Ƃ��Aprint���Ԃ��N���[�W���� environment�����o��NULL�ɂȂ��Ă��܂��B

����āA

  p = print;
  p("hello, world.\n");

�Ƃ����悤�ɁA���ʂ̊֐���ϐ��ɑ�����邱�Ƃ��”\�ł��B

���\�b�h���ǂ�

crowbar�ł́A���Ƃ��Δz��ɂ�size()�Ƃ����u���\�b�h�̂悤�Ȃ��́v ���t���Ă��܂����B

���āA������ǂ��������邩�ł����A ���̊֐��Ɠ����悤�ɁA�N���[�W����Ԃ��悤�ɂ���ƁA �z���size()�ɑΉ�����֐����A �l�C�e�B�u�֐��Ȃ艽�Ȃ�ō��Ȃ���΂Ȃ�܂���B �܂��A���͍̂��΂悢�̂ł����A �����CRB_Closure�ɂ́A�uarray.size()�v�ƌĂяo�����ہA array�ւ̎Q�Ƃ�ێ�����ꏊ������܂��񂩂�A �Ăяo����Ă��z��̃T�C�Y��Ԃ����Ƃ͂ł��܂���B

�����ŁACRB_Value�̋��p�̂ɁA �u���\�b�h���ǂ��v��pCRB_FakeMethod�Ƃ��������o��lj����邱�Ƃɂ��܂��� (��̕��Ō�q����ƌ����������̂����ЂƂ‚�����)�B

typedef struct {
    char        *method_name; /* ���\�b�h�� */
    CRB_Object  *object;      /* �uthis�v�ɑ�������I�u�W�F�N�g */
} CRB_FakeMethod;

�֐��Ăяo���̍ہA�Ώۂ��N���[�W���łȂ��u���\�b�h���ǂ��v�̏ꍇ�́A ver.0.2�Ɠ����悤�ɁA�\�[�X���ߍ��݂Ńx�^�ɏ������Ă��܂��B

���󂷂��

�u�N���[�W���v�Ƃ����@�\�́ALisp�Ȃǂ̊֐��^����ł͂悭�g���܂��B Perl��Ruby��Python��JavaScript�ɂ����݂��܂��B �\�\���A���͂����̌�����قƂ�ǎg�������Ƃ��Ȃ��̂ŁA �N���[�W���́u�g���ǂ���v�͂����炭�g�ɕt���ĂȂ��Ǝv���܂��B

�܂��Acrowbar�̃I�u�W�F�N�g�́A�N���X�����ɐ��������̂ł͂Ȃ��A �C���X�^���X���ƂɈقȂ�f�[�^�����o�⃁�\�b�h�����‚��Ƃ��ł��܂��B ���̂悤�Ȍ�����u�v���g�^�C�v�x�[�X�v�ƌĂԂ̂ł��� (�����crowbar�ɂ̓v���g�^�C�v�`�F�[�����Ȃ��̂ŁA �����Ă�ł悢������^��ł����c)�A ���́A �v���g�^�C�v�x�[�X�̃I�u�W�F�N�g�w������� �낭�Ɏg�������Ƃ͂���܂���(JavaScript�ŏ��X���������x)�B

�o�����󂢂��炱���A����Ă݂邱�Ƃŗ������Ă݂悤�A �Ƃ����ړI���������킯�ł����A ���������Ԉ�������������Ă���”\��������܂��B �ԈႢ�����t�������́A�ǂ�����w�E���������܂�(_o_)

����̂���

�����܂łŁA����̃R�A�Ƃ��Ă̋@�\�͂��Ȃ葵���Ă����Ǝv���̂ł����A ���ƈʼn_�ɍ���Ă������߁A���낢�낢�т‚ȂƂ��������܂��B

�Ȍ�̊g��(�Ƃ������d�l�̃o�O�t�B�b�N�X?)�́A ������������ȂƂ��납�Ȃ��A�ƍ��̂Ƃ���v���Ă��܂��B

����ł͂܂��C���ɂ��҂����������܂��B

�Q�lURL



�O�̃y�[�W | ���̃y�[�W | �ЂƂ�̃y�[�W�ɖ߂� | �g�b�v�y�[�W�ɖ߂�