���̂���̌���̓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
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);
�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(�����җ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
�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
���ā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
��̃��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();
�܂��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
���Ɂ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
���Ɂ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
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
�����āA10�s�ڂ�c2���Ăяo���ꂽ�ۂɂ́A �K��2�ɂ��A c2���Q�Ƃ��Ă����X�R�[�v�`�F�[�����V����LocalEnvironment�ɘA������܂�����A c2�̒������a��b�������Ƃ��Q�Ƃ��邱�Ƃ��ł���킯�ł��B
�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
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