Revision | 5e960ae0d48030721dec541dabeb10b862c9f606 (tree) |
---|---|
Time | 2018-04-01 23:08:57 |
Author | dhrname <dhrname@user...> |
Commiter | dhrname |
Modify the ST_eval function
@@ -464,8 +464,8 @@ ST_Binary_Tree ST_parse(ST_Token_Mode *array, size_t length, ST_Ordered_Pair *l | ||
464 | 464 | /*ST_eval 関数 |
465 | 465 | * ベータ簡約を用いて、解析リストの評価を行う |
466 | 466 | * 返り値は左の枝が変数リストで、右の枝が関数抽象の隣接リストである二分木 |
467 | - * この際、その変数リストも関数抽象の隣接リストも、 | |
468 | - * 引数で指定されたリスト(listとblist)とは異なり、新たに作成されたオブジェクトである*/ | |
467 | + * この際、返り値である変数リストも関数抽象の隣接リストも、 | |
468 | + * 新たに作成されたオブジェクトである*/ | |
469 | 469 | ST_Binary_Tree ST_eval(ST_Ordered_Pair *list, ST_Binary_Tree blist) |
470 | 470 | { |
471 | 471 | /*エラーを明確にするため、listやblistのNULLチェックは |
@@ -477,8 +477,24 @@ ST_Binary_Tree ST_eval(ST_Ordered_Pair *list, ST_Binary_Tree blist) | ||
477 | 477 | return ST_EMPTY; |
478 | 478 | } |
479 | 479 | |
480 | + /*blistから関数抽象を取り出す*/ | |
481 | + ST_Binary_Tree abstract = ST_getListItem(blist, 0); | |
480 | 482 | |
481 | - return ST_pairTree(list, blist); | |
483 | + /*返り値(変数か、関数抽象)*/ | |
484 | + ST_Ordered_Pair *resultlist = list; | |
485 | + | |
486 | + if ( !ST_isEmpty(ST_second(ST_getSecondTree(abstract))) ) | |
487 | + { | |
488 | + /*「甲」(乙)「丙」(丙)のように、abstrctが関数適用の対象であれば、 | |
489 | + * ベータ変換を試みる*/ | |
490 | + resultlist = ST_second(ST_getFirstTree(abstract)); | |
491 | + } | |
492 | + else | |
493 | + { | |
494 | + resultlist = list; | |
495 | + } | |
496 | + | |
497 | + return ST_pairTree(resultlist, blist); | |
482 | 498 | } |
483 | 499 | |
484 | 500 | /*以下の連結リスト構造については数学の集合とラムダ計算と意味論を参照のこと |
@@ -454,14 +454,17 @@ int main(int argc, char **argv) | ||
454 | 454 | init_token_length(tokens6, length); |
455 | 455 | varlist = ST_tokenize(u8"「海」(愛)とは、「涙」(謎)", tokens6); |
456 | 456 | btr = ST_parse(tokens6, length, varlist); |
457 | - evalresult = ST_eval(varlist, btr); | |
458 | - //assert(ST_getFirstTree(evalresult) != varlist); | |
457 | + rebtr = ST_reverse(btr); | |
458 | + evalresult = ST_eval(varlist, rebtr); | |
459 | + assert(ST_getFirstTree(evalresult) != varlist); | |
460 | + assert(ST_first(ST_getFirstTree(evalresult)) == ST_getItem(varlist, 1)); | |
459 | 461 | /*assert(ST_getFirstTree(evalresult) != ST_setChurchNumber(3, ST_second, varlist)); |
460 | 462 | be = ST_getSecondTree(evalresult); |
461 | 463 | assert(ST_isEmpty(be));*/ |
462 | 464 | |
463 | 465 | |
464 | 466 | ST_freetree(btr); |
467 | + ST_freetree(rebtr); | |
465 | 468 | ST_freelist(varlist); |
466 | 469 | |
467 | 470 | ST_Token_Mode tresult[1] = {0}; |