Cããªããã»ããµã¡ã¿ããã°ã©ãã³ã°ã§ãæååç³»æ³¥æ²¼é¢æ°åããã°ã©ãã³ã°
ä»å¹´ã®æåç¥ã§æ¸ããè¨äºã§ãã
-
-
- -
-
Cè¨èªã¨ããã°ããããªã¤ã¡ã¼ã¸ãéå»ã®éºç£ã¨ãã£ãæããããããããã¾ããã
Cè¨èªã®ãã¬ãã£ããªå´é¢ã¨ããã¨ããã¯ããã¤ã³ã¿ãã¡ã¢ãªç®¡çãªã©ãé£ãããã¨ãããã¨ãæãã¤ãããããã¾ããã
ããããCè¨èªã®ãã¤ã³ã¿ã¯è¡¨è¨ã«é¨ãããããã ãã§ãä»çµã¿èªä½ã¯å ¨ãé£ããããã¾ããã
ææ³ããã©ããã®PerlãC++ã¨æ¯ã¹ããå±ã§ããªãåç´ãã§ãã
å®ã®ã¨ããã仿§ãç ©éã§é£ããã®ã¯ãCããªããã»ããµãªã®ã§ããã¾ãã
æ®æ®µãããã¾ãè¤éãªä½¿ããããããªãããæ°ã¥ããªãããããã¾ããããCããªããã»ããµã®ç½®æå¦çã¯ã欺çã¨è£åãã«æºã¡ãä¸çãªã®ã§ãã
ãããé²åããã¨ãã³ãã¬ã¼ããªã©ã¨ãã£ããã£ã¨é¢ç½ããã®ã«ãªãã®ã§ãããä»åã¯Cããªããã»ããµã§è¨ç®ããã¡ãã£ããããã¨ããã¾ã§è©¦ãã«ãã£ã¦ã¿ã¾ãããã
(ãªããGCCã«ããå®é¨çã«èª¿ã¹ãè¨äºãªã®ã§ãä»ã®Cã³ã³ãã¤ã©ã§ã¯æåãéãå¯è½æ§ãããã¾ãã)
Cããªããã»ããµã®èµ·åæ¹æ³
Cããã°ã©ã ãã³ã³ãã¤ã«ããã°ãCããªããã»ããµã¯ãã®å¦çã®éä¸ã§èµ·åãã¾ãããä»åã¯Cããªããã»ããµã®åºåãç´æ¥è¦ãã®ã§ãCã³ã³ãã¤ã©ã¯èµ·åãã¾ããã
GCCã§ã¯ã以ä¸ã®ããã«ããã¨ããªããã»ããµã®ã¿ãèµ·åã§ãã¾ãã
% gcc -E test.c # 1 "test2.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "test2.c"
(#ã§å§ã¾ãåºåã¯ãã³ã³ãã¤ã«ã¨ã©ã¼çã®çºçç®æãæ£ããå ãã¡ã¤ã«ã¨å¯¾å¿ã¥ããããã®ãã¼ã¯ãªã®ã§ç¡è¦ãã¦ãã ããã)
åºæ¬
Cããªããã»ããµã¯å¤§ãããã£ã¦æ¬¡ã®ãããªå¦çãè¡ãã¾ãã
- è¡ã®çµå
- ã³ã¡ã³ãã®é¤å»
- æ¡ä»¶åå²
- ã½ã¼ã¹ã®çµå
- åèªã®ç½®æ
è¡ã®çµå
ããã¯ã¹ã©ãã·ã¥*1ã®å¾ã«æ¹è¡æåãç¶ãã¨ãããã¯æåã«é¤å»ããã¾ãã
ãªã®ã§æ¬¡ã®ãããªã½ã¼ã¹ã¯OKã§ãã
# de\ fi\ ne /\ * comment *\ / EOF (-1)
ã³ã¡ã³ãã®é¤å»
ã³ã¡ã³ããé¤å»ãã¾ãã
æ¡ä»¶åå²
以ä¸ã®ã½ã¼ã¹ã®ããã«ãç°å¢è¦å ãªã©ã«ãã£ã¦ã½ã¼ã¹ã®æçãæ¿å ¥ãããããªãã£ãããã¾ãã
#ifdef __cplusplus extern "C" { #endif
ã½ã¼ã¹ã®çµå
ããããincludeã§ãããã¾ãç¥ããã¦ã¾ããããinclude_nextã¨ãããã®ããããããã§ãã
åèªã®ç½®æ
ä¸è¨ã®ã½ã¼ã¹ã§EOFã-1ã¨è¦åãããã®ã¯ãããªããã»ããµãEOFã(-1)ã«ç½®ãæãã¦ããããã§ãã
#define EOF (-1) EOF
ä¸è¨ã®ãããªå¦çããããã³ã¼ãã¯ãã®ã¾ã¾Cã³ã³ãã¤ã©ã«æ¸¡ãããæ§æè§£æãè¡ãã¾ãã
Cããªããã»ããµã§ããã°ã©ã ãæ¸ãæ¹æ³(1)
以ä¸ã®ãããªã³ã¼ãã¯ãç¡éå帰ã¨ãªããçµäºãã¾ããã(æ£ç¢ºã«ã¯ã¹ã¿ãã¯ãªã¼ãã¼ããã¼ã§ç°å¸¸çµäºãã¾ã)
#include "test.c" /* èªåèªèº«ãinclude */
ããã¨ã#ifã«ããæ¡ä»¶åå²ã䏿ã«ä½¿ãã°ãæ§ã ãªè¨ç®ãè¡ãããã§ãã#ifã«ã¯Cã¨ä¼¼ãææ³ã§è¨ç®ãè¡ãæ¹æ³ãããã®ã§ãããã使ãã°æç¶ãçã«è¨ç®ãè¡ãããã§ãããããããã¯ç¡è¬ã§ãã
ãªããªãã°ãè¨ç®çµæãä»£å ¥ããææ®µãç¡ãããã§ããä»£å ¥ã¨ããã°ã#defineã使ãããã¨æãã§ããããããã#defineã¯å®ç¾©ã夿´ãããã¨ã¯ã§ãã¦ããæ¢åã®å®ç¾©ããã®è¨ç®çµæãä¿åãããã¨ã¯ã§ãã¾ããã以ä¸ã®ä¾ãè¦ã¦ãã ããã
#define X 2 #define Y (X+5) Y /* ãã®æç¹ã§ã¯Yã¯(2+5) */ #undef X #define X 3 /* Xãåå®ç¾© */ Y /* Yã¯(3+5) */
ãã®ããã«ãdefineå ã®è¨å·ã¯ãã®å ´ã§ã¯ç½®æãããªãã®ã§ãè¨ç®çµæãä¿åãããã¨ã¯ã§ãã¾ããããã®ãããæç¶ãçã«ããã°ã©ã ãæ¸ãã®ã¯ç¡è¬ã§ãã
Cããªããã»ããµã§ããã°ã©ã ãæ¸ãæ¹æ³(2)
ããã§ã¯ãã©ã®ããã«æ¸ãã°ããã®ã§ããããã
çãã¯ããé ã®ç½®ãæããããªãã¡defineã®ã¿ã使ã£ã¦ã颿°åè¨èªã®ããã«ããã°ã©ã ãæ¸ããã§ãã
ããã§ã¯ããã®é常ã«å¼·åãã¤æ¬ºçã«æºã¡ãé ã®ç½®ãæãæ©è½ãä¸å¿ã«æ®ãã¦ããã°ã©ã ãæ¸ãã¾ãã
defineã®åºæ¬
defineã«ããå®ç¾©æ¹æ³ã¯2種é¡ããã¾ãã
#define A_VALUE (5+6) #define A_FUNC(x,y) (x+y) A_VALUE /* (5+6) */ A_FUNC(3,4) /* (3+4) */
ã¤ã¾ããåèªåä½ã§ç½®æããã¦ããããã夿°ã§ãããã®ããã«æ¯ãèããã®ã¨ãæ¬å¼§ã¤ãã§ç½®æããã¦ããããã颿°ã§ãããã®ããã«æ¯ãèããã®ãããã¾ãã
å帰
ãã®ç½®ãæãã¯ä¸åº¦ã ãè¡ãããããã§ã¯ããã¾ãããå ã®ã½ã¼ã¹ã®ããã«
#define X 2 #define Y (X+5) Y /* (X+5)ãå度å±éããã¦(2+5)ã«ãªãï¼ */
ã¨ãã風ã«ã夿®µçã«å±éããã¾ãã
ã§ã¯ã次ã®ã³ã¼ãã¯ã©ãã§ããããã
#define X Y #define Y X X /* X -> Y -> X -> Y ... ç¡éã«ã¼ãï¼ */
ç¡éã«ã¼ãã«ãªãããã«è¦ãã¾ããã
ãããå®éã¯ãXã¨åºåããã¦çµäºãã¦ãã¾ãã¾ãã
ããã¯ãANSI Cã®è¦æ ¼ã§ãXã®å±éã®ä¸ã§Xãåºã¦ããã®ã§ããã以ä¸å±éããã®ãæ¢ãããã¨ãã仿§ã«ãªã£ã¦ããããã§ãã
ããã®ããã§æ®éã«åå¸°ãæ¸ãããé常ã«è¦å´ãã¾ãã
ãã ãã以ä¸ã®ãããªæ¸ãæ¹ã§ã¯æ£å¸¸ã«åä½ãã¾ãã
#define test(x) a x /* 弿°ã®ç´åã«ãaããä»å ãã */ test(test(x)) /* a a x ã«ãªã */
ããã¯ãå ã«å å´ã®é¢æ°ããa xãã«å±éãããããã§ãããã®è©ä¾¡é åºãã¾ã話ãããããããã¾ãã
æååå
æåååã¨ããæ©è½ãããã¾ãã
#define str_2(x) #x str_2(google) /* "google" ã¨ããæååã«ãªã */
ããã¯ãä¾ãã°æ¬¡ã®ããã«æ´»ç¨ã§ãã¾ãã
#define pf(fmt, val) fprintf(stderr, #val " = " fmt ";\n", val); pf("%d", i); /* ãã㯠*/ fprintf(stderr, "i" " = " "%d" ";\n", i); /* ã«å±éããããããã°ç¨ã«ä¾¿å©ã */
ãã ããè¯ãåã®ã¿ããªã¯ãããã¬ã使ãã¾ãããã
ã¾ãããããå©ç¨ãã¦ã以ä¸ã®ã³ã¼ãã§èªåèªèº«ãåºåãããã¨ãã§ãã¾ã(ãã®ãããªã³ã¼ããQuineã¨è¨ãã¾ãã)
#define t(u)v=#u;u t(main(){printf("#define t(u)v=#u;u\nt(%s)",v);})
ã©ã®ããã«ãã¦èªåèªèº«ãåºåããããèãã¦ã¿ãã¨é¢ç½ãããããã¾ããã
ãã¼ã¯ã³ã®çµå
æåååããç¥ããã¦ãã¾ããããæåååã¨ä¸¦ãã§ããã¼ã¯ã³ã®çµåã¨ããæ©è½ãããã¾ãã
#define deftype(t) const char* typename_##t = #t; deftype(int); /* const char* typename_int = "int"; */ deftype(char); /* const char* typename_char = "char"; */
ããã§ã¯ããã¼ã¯ã³ãtypenameãã¨å¼æ°tã®ä¸èº«ãçµåãã¦ããtypename_intãã¨ããå¥ã®ãã®ãä½ã£ã¦ãã¾ã£ã¦ãã¾ãã
次ã®ãããªãã¨ãå¯è½ã§ãã
#define cat(a,b) a##b cat(+,=) /* += ã«ãªã */ cat(0x, 190) /* 0x190 ã«ãªã */ cat(value_, 100) /* value_100 ã«ãªã */ cat(20, 0777) /* 200777 ã«ãªã */
ãããã¸ãããæ°å³ãæªããªã£ã¦ãã¾ããã
æåååã¨ãã¼ã¯ã³çµåã®ç½
次ã®ãããªæåååã«ã¯æ³¨æãå¿ è¦ã§ãã
#define str_2(x) #x #define EOF (-1) str_2(EOF) /* ããã¯"EOF" */
ãã®ããã«ãæåååã¯å¼æ°ãå±éãã¾ããã(ãã¼ã¯ã³çµåãåæ§)
ãããåé¿ããããã以ä¸ã®ããã«ä¸éã¨ãªããã¯ããæã¿ã¾ãã
#define str_2(x) #x #define str(x) str_2(x) #define EOF (-1) str(EOF) /* ããã¯"(-1)" */
æ¡ä»¶åå²
ã§ã¯ããã°ã©ã ã®å§ãã¨ãã¦ãæ¡ä»¶åå²ãæ¸ãã¦ã¿ã¾ãããã
#define D_if(b) D_if_2(b) #define D_if_2(b) D_if_##b #define D_if_0(x,y) y #define D_if_1(x,y) x D_if(1)(a,b) /* a */ D_if(0)(a,b) /* b */
ããã§æ¡ä»¶åå²ãã§ãã¾ãã
ããã¯ã©ã®ãããªä»çµã¿ãã¨ããã¾ãã¨
D_if(1)(a,b) D_if_2(1)(a,b) D_if_1(a,b) a
ã¨ããããã«ãä¸ããããå¤ã0ã1ãã§ãå¥ã ã®é¢æ°ãè¿ããããªä»çµã¿ã«ãªã£ã¦ãã¾ãã
æ¡ä»¶åå²ãã§ããã®ã§ããã¼ã«æ¼ç®åã¯ç°¡åã«å®ç¾©ã§ãã¾ãããæ¬¡ã¯andã®ä¾ã§ãã
#define D_Band(a,b) D_if(a)(b,0)
ãªã¹ã
åä¸ã®å¤ã¯ããã§å®ç¾©ã§ãã¾ããããå¤ã®éåãã¤ã¾ãé åã®ãããªãã®ãå®ç¾©ã§ãã¦ã¾ãããã
ããã§ã¯ããªã¹ãããå®ç¾©ãã¦ã¿ã¾ãããã
Cããªããã»ããµã§ãªã¹ãæ§é ãä½ãæ¹æ³ã¯ãåã¯æ¬¡ã®2ã¤ãæãã¤ãã¾ããã
(a, (b, (c, ) ) ) /* a,b,cã¨ãããªã¹ã */
ã¾ãã¯
(a) (b) (c) /* a,b,cã¨ãããªã¹ã */
ãªã¹ãã§ããã®ã«å¿ è¦ãªã®ã¯æ¬¡ã®æ¡ä»¶ã§ãã
- ãªã¹ãã空ãå¤å®ã§ããã(nilå¤å®)
- ãªã¹ãã空ã§ãªãå ´åããªã¹ãã®å é ãåãã ããã(headã¾ãã¯car)
- ãªã¹ãã空ã§ãªãå ´åããªã¹ãã®å é 以å¤ã®ãªã¹ããåãã ããã(tailã¾ãã¯cdr)
- å¤ããªã¹ãã®å é ã«è¿½å ãã¦æ°ãããªã¹ããä½ããã(cons)
ä»åã¯ãç¨éãéå®ããããªã¹ããªã®ã§ã次ã®ãããªæ§é ã«ãã¾ããã
1 0 0 1 0 1
ç°¡åã§ããã§ããã
ãã®ãªã¹ããåãåºãããã«ã次ã®ãã¯ããå¿ è¦ã§ãã
#define D_addcomma_0 0, #define D_addcomma_1 1,
ä»ã®ãã¼ã¯ã³ããªã¹ãã§æ±ãå ´åã¯ãå¿ ããããå®ç¾©ããªããã°ããã¾ãããå¾ã§å鲿³ã®æ¡ãæ±ãã®ã§ã2ãã9ã¾ã§ã¯ç»é²ãã¦ããã¾ããã
ãã®ãªã¹ããæä½ããåºæ¬ã®é¢æ°ã¯ä»¥ä¸ã§ãã
#define D_head(list) D_head_2(D_cat(D_addcomma_,list)) #define D_head_2(x) D_head_3(x) #define D_head_3(a,b) a #define D_tail(list) D_tail_2(D_cat(D_addcomma_,list)) #define D_tail_2(x) D_tail_3(x) #define D_tail_3(a,b) b #define D_____EOL ,0 #define D_____SOL_D_____EOL ,1 #define D_nil_p(list) D_nil_p_2(list D_____EOL) #define D_nil_p_2(list) D_nil_p_3(D_____SOL_##list) #define D_nil_p_3(x) D_nil_p_4(x) #define D_nil_p_4(a,b) b
headã¨tailã¯ãD_addcomma_ã¨ãããã¼ã¯ã³ã¨ä¸ãããããªã¹ããçµåãããã¨ã§ãæåã®é
ç®ã¨ãã以å¤ãã³ã³ãã§åé¢ãã¾ãã
ããã弿°ã¨ãã¦æ¸¡ãã°ã³ã³ãã®åå¾ã®å¤ãå¥ã
ã«åãåºãã¾ãã
D_head_2,D_tail_2ã¨ãããã¯ããã¯ãã·ã§ã³ãã¦ãã¾ãããããããªãã¨ã³ã³ãã弿°åºåãã¨ãã¦è¦åãã¾ããã
nilå¤å®ã¯ãD_____SOL_ã¨D_____EOLãlistãæãã§çµåãã¾ããããå¤ãnilã§ããã°ãD_____SOL_D_____EOLãã§ããããã§ãªããã°D_____EOLã«ãªãã¾ãã
ãããã³ã³ãã§åé¢ãã¦åæ§ã«åãåºãã°nilãã©ãããåããã¨ããä»çµã¿ã§ãã
ãªã¹ãã®çµåã¯ãåã«ãã¼ã¯ã³ã並ã¹ãã°ããã ãã§ãããããã§ããã
ã¾ãè£å©ãã¯ãã¨ãã¦ä»¥ä¸ãå®ç¾©ãã¾ããããã¯å¤ãnilã®å ´åã«å¥ã®ãªã¹ãã§ä»£æ¿ãããã®ã§ãã
#define D_Lor(list1,list2) D_if(D_nil_p(list1))(list2,list1) #define D_tail_or(list1,list2) D_tail(D_Lor(list1,list2)) #define D_head_or(list1,list2) D_head(D_Lor(list1,list2))
ã«ã¼ã
ã«ã¼ãã¯é常ã«åä»ã§ãããªãã¨ãã£ã¦ããå帰ãå³å¯ã«ç¦æ¢ããã¦ããã®ã§ããã¾ããã¨åé¿ããªããã°ããã¾ããã
ããã§ä»¥ä¸ã®ããã«ãã¾ããã
#define D_whileZ0(p,f,x) D_if(p x)(f x, x) #define D_whileZ1(p,f,x) D_if(p x)(D_whileZ0(p,f,D_whileZ0(p,f,x)),x) #define D_whileZ2(p,f,x) D_if(p x)(D_whileZ1(p,f,D_whileZ1(p,f,x)),x)
ããã¯ãp xã1ã®ããã ãxã«f xã代å
¥ãã¦ãæçµçãªçµæãè¿ãã¾ãã
D_whileZ0ã¯ããp xã1ãªãf x,ããã§ãªããã°xãè¿ããã¨ãªãã¾ãããããã¯ãä¸é1åã®whileãã¨è¨ãã¾ãã
D_whileZ1ã¯ããp xã1ãªãp xãæç«ããéxã«f xã代å
¥ãã¦ãããä¸åãããããããããªããã°xãè¿ãããªã®ã§ãããã¯ãä¸é2åã®whileãã¨è¨ãã¾ãã
æ°ã大ãããã¦ããã¨ä¸éåæ°ã¯ææ°çã«å¢ããã®ã§ãD_whileZ32ã§ã¯ç´40ååã¾ã§ç¹°ãè¿ããã¨ãã§ãã¾ããã¾ãããã¯ã«ã¼ããçãçµãã£ãã¨ããæ¯è¼ççæéã§çµäºããããã§ãå¹çãè¯ãã§ãã
ãªããp(x)ã§ã¯ãªãp xã¨ãªã£ã¦ããã®ã¯ãx=(a,b,c)ã®ããã«ãã¦å¤å¤ãç°¡åã«æ±ãããã§ãã
ãã®whileã§æ°ãã¤ããªãã¦ã¯ãããªãã®ã¯ãpãfã®å é¨ã§åãwhileãå¼ã¶ã¨å帰ã«ãªã£ã¦åæ¢ãã¦ãã¾ãã®ã§ãåãå 容ã®whileã大éã«ç¨æãã¦ä½¿ããããªãã¨ãããªãã¨ãããã¨ã§ãããããã«ãã®è¾ºãã¯é¢åã ã£ãã®ã§ãRubyã§ã«ã¼ããåãã¦whileAããwhileZã¾ã§èªåçæãã¾ããã
ã«ã¼ãã使ã£ãããã°ã©ã ã®æåã®ä¾ã¨ãã¦ããªã¹ãã®é çªãéã«ããããã°ã©ã ãä½ã£ã¦ã¿ã¾ãããã
#define D_reverse_p(list1,list2) D_Bnot(D_nil_p(list1)) #define D_reverse_f(list1,list2) (D_tail(list1),D_head(list1) list2) #define D_reverse(list) D_tuple2_2(D_whileZ(D_reverse_p, D_reverse_f, (list,)))
listãåãã¨ã£ã¦ã«ã¼ããåããlist1ã®å é ããå¤ãåã£ã¦list2ã®å é ã«ä»ãå ãã¦ããã¾ããlist1ãnilã«ãªã£ããlist2ãè¿ãã¾ãã
æ°å¤
ä»åã¯éè² æ´æ°ã®ã¿ãæ±ã£ã¦ã¿ã¾ãã
æ°å¤ã¯0,1ã®å¤ã®ãªã¹ããã¤ã¾ãå¯å¤é·ã®2鲿°ã§è¡¨ç¾ãããã¨ã«ãã¾ãã
å
é ã®ã»ããå°ããæ¡ã¨ãã¾ããã¤ã¾ãã0 0 1 1ãã¯ã12ãæå³ãã¾ãããã®ããã«ããã¨ãæ¡ãè¶³ããªãã¨ãã0ãç°¡åã«è£ããã¨ãã§ãã¾ãããè¨ç®é åºã«åè´ãã¦ãã¾ãã
ä»åã¯å ç®ã¨æ¯è¼ã ãå®ç¾©ãã¦ã¿ã¾ãããã
æ°å¤ã®å ç®
#define D_Nplus_p(a,b,c,r) D_Bor(c,D_Bnot(D_Band(D_nil_p(a),D_nil_p(b)))) #define D_Nplus_f(a,b,c,r) D_Nplus_f_2(D_head_or(a,0),D_head_or(b,0),c,r,D_tail_or(a,0),D_tail_or(b,0)) #define D_Nplus_f_2(ha,hb,c,r,ta,tb) (ta,tb,D_Nplus_cn(ha,hb,c),r D_Nplus_dig(ha,hb,c)) #define D_Nplus(a,b) D_tuple4_4(D_whileZ(D_Nplus_p, D_Nplus_f, (a,b,0,))) #define D_Nplus_dig(a,b,c) D_Bxor(D_Bxor(a,b),c) #define D_Nplus_cn(a,b,c) D_if(D_Bxor(a,b))(c,a)
è²¼ã£ã¦ãæ£ç´ãããã¥ããã¨æãã¾ãããæ¦è¦ã ã説æãã¾ãã
aã¨bãå ç®ãããæ°ãcãæ¡ã®ç¹°ãä¸ããã§ããaã¨bããä¸çªä¸ã®æ¡ãåãåºãã¦ããã¨æ¡ã®ç¹°ãä¸ããã®3ã¤ã®æ°ã®åãæ±ãã¾ã(D_Nplus_digã¨D_Nplus_cn)
ãããç¹°ãè¿ãã¦æ°ããæ°ãæ§æããããè¶³ããã®ãç¡ããªã£ããçµäºã§ãã
æ°å¤ã®æ¯è¼
#define D_Nlt_p_p(a,b,r) D_Bnot(D_Band(D_nil_p(a),D_nil_p(b))) #define D_Nlt_p_f(a,b,r) (D_tail_or(a,0),D_tail_or(b,0),D_Nlt_p_dig(D_head_or(a,0),D_head_or(b,0))(r)) #define D_Nlt_p_dig(a,b) D_Nlt_p_dig_2(a,b) #define D_Nlt_p_dig_2(a,b) D_Nlt_p_dig##a##b #define D_Nlt_p_dig00(r) r #define D_Nlt_p_dig11(r) r #define D_Nlt_p_dig01(r) 1 #define D_Nlt_p_dig10(r) 0 #define D_Nlt_p(a,b) D_tuple3_3(D_whileZ(D_Nlt_p_p, D_Nlt_p_f, (a,b,0))) #define D_Nlteq_p(a,b) D_tuple3_3(D_whileZ(D_Nlt_p_p, D_Nlt_p_f, (a,b,1))) #define D_Neq_p(a,b) D_Band(D_Nlteq_p(a,b),D_Nlteq_p(b,a))
aã¨bã®å¤§ãããæ¯è¼ãã¾ããä¸ã®æ¡ããé çªã«ææ»ãã¾ãã
ç¾æç¹ã§ã®å¤§å°ãrã«è¨æ¶ãã¦ããã¾ããããæ¡ã®å¤§å°ã«ãã£ã¦rãæ¸ãæãã¾ã(D_Nlt_p_dig)ãå
·ä½çã«ã¯ããã®æ¡ã§a=bãªãrã¯å¤æ´ãªãããã®æ¡ã§aã¨bãç°ãªããªããã®æ¡ã®å¤§å°ãrã¨ãã¾ãã
ãããç¹°ãè¿ãã¦ãããæçµçã«å¦çããæ¡ãç¡ããªã£ãæç¹ã®rãçãã«ãªãã¾ãã
åé²å
ä»ã¾ã§ã§æ±ãã¦ããæ°å¤ãå鲿°è¡¨è¨ã«å¤æãã¾ãã
#define D_ND_Dbl_p(a,r,c) D_Bor(c,D_Bnot(D_nil_p(a))) #define D_ND_Dbl_f(a,r,c)(D_tail_or(a,0),r D_N_toD_s(D_head_or(a,0),c)) #define D_ND_Dbl(a,c) D_tuple3_2(D_whileZ(D_ND_Dbl_p, D_ND_Dbl_f, (a,,c))) #define D_N_toD_s(a,c) D_N_toD_s_(a,c) #define D_N_toD_s_(a,c) D_N_toD_s##a##c #define D_N_toD_s00 0,0 #define D_N_toD_s01 1,0 #define D_N_toD_s10 2,0 (ä¸ç¥) #define D_N_toD_s81 7,1 #define D_N_toD_s90 8,1 #define D_N_toD_s91 9,1 #define D_N_toDlst_p(a,r) D_Bnot(D_nil_p(a)) #define D_N_toDlst_f(a,r) (D_tail(a), D_ND_Dbl(r,D_head(a))) #define D_N_toDlst(a) D_Lor(D_tuple2_2(D_whileY(D_N_toDlst_p, D_N_toDlst_f, (D_reverse(a),))),0) #define D_N_toDstr_p(a,r) D_Bnot(D_nil_p(a)) #define D_N_toDstr_f(a,r) (D_tail(a), D_cat(r,D_head(a))) #define D_N_toDstr(a) D_tuple2_2(D_whileZ(D_N_toDstr_p, D_N_toDstr_f, (D_reverse(D_N_toDlst(a)),)))
ã¾ããå鲿°ã«å¯¾ãã¦ã2åãããã¯2å+1ãæ±ãããã¨ããè¨ç®ãå®ç¾©(D_ND_Dbl)ãã¾ãã
2åãæ±ããéç¨ã§æ¡ã®ç¹°ãä¸ããã使ãã®ã§ããããåå©ç¨ããã°2å+1ãæ±ã¾ãã¾ãã
äºé²æ°ãä¸ä½ã®æ¡ããé çªã«å¦çããæ¡ã«ãã£ã¦2åãããã¯2åãã¦1ãå ç®ãã¾ãã
ã¤ã¾ã2鲿³ã®ã1010ãã ã¨ãã((((0*2+1)*2)*2+1)*2)ãã¨ããè¨ç®ãå鲿³ã§è¡ãã¾ãã
ãã®ããã«ãã¦å鲿³ã®æ°å¤ã«ç´ãã(D_N_toDlst)ãã®ã«å¯¾ãã¦ããã¼ã¯ã³ã®çµåãè¡ãã¾ã(D_N_toDstr)ããããåé²è¡¨è¨ã«ãªãã¾ãã
ãã£ãããã
æå¾ã«ãã£ããããã®è¨ç®ãè¡ã£ã¦ã¿ã¾ãããã
#define D_fib_p(a,b,c,i) D_Nlt_p(i,c) #define D_fib_f(a,b,c,i) (b,D_Nplus(a,b),c,D_Nplus(i,D_N1)) #define D_fib(c) D_tuple4_2(D_whileY(D_fib_p, D_fib_f, (D_N0,1,c,D_N0)))
å¿
è¦ãªè¨ç®ã¯å
¨ã¦å®ç¾©ããã®ã§ã ãã¶ç°¡åã«ãªãã¾ãããã
iã¯ç¾å¨ã®ã«ã¼ãåæ°ã§ããaã¯ãã£ããããæ°åã®(i-1)çªç®ãbã¯ãã£ããããæ°åã®içªç®ã§ãã(a,b)ã®ãã¢ãã(b,a+b)ãæ±ãã¦ããã¾ãã
ã«ã¼ãã«ã¦ã³ã¿ã®iãæå®ããåæ°c以ä¸ã«ãªã£ããçµäºããbãè¿ãã¾ãã
æçµçãªã½ã¼ã¹
以ä¸ãã½ã¼ã¹å ¨æã§ããããã§ãã£ããããæ°ãã³ã³ãã¤ã«æã«è¨ç®ããã¾ãã
main.c
#define D_same(x) x #define D_str(x) D_str_2(x) #define D_str_2(x) #x #define D_cat(a,b) D_cat_2(a,b) #define D_cat_2(a,b) a##b #define D_cat3(a,b,c) D_cat3_2(a,b,c) #define D_cat3_2(a,b,c) a##b##c #define D_tuple1_1__(a) a #define D_tuple2_1__(a,b) a #define D_tuple2_2__(a,b) b #define D_tuple3_1__(a,b,c) a #define D_tuple3_2__(a,b,c) b #define D_tuple3_3__(a,b,c) c #define D_tuple4_1__(a,b,c,d) a #define D_tuple4_2__(a,b,c,d) b #define D_tuple4_3__(a,b,c,d) c #define D_tuple4_4__(a,b,c,d) d #define D_tuple1_1(a) D_tuple1_1__ a #define D_tuple2_1(a) D_tuple2_1__ a #define D_tuple2_2(a) D_tuple2_2__ a #define D_tuple3_1(a) D_tuple3_1__ a #define D_tuple3_2(a) D_tuple3_2__ a #define D_tuple3_3(a) D_tuple3_3__ a #define D_tuple4_1(a) D_tuple4_1__ a #define D_tuple4_2(a) D_tuple4_2__ a #define D_tuple4_3(a) D_tuple4_3__ a #define D_tuple4_4(a) D_tuple4_4__ a #define D_if(b) D_if__2(b) #define D_if__2(b) D_if_##b #define D_if_0(x,y) y #define D_if_1(x,y) x #define D_ifB(b) D_ifB__2(b) #define D_ifB__2(b) D_ifB_##b #define D_ifB_0(x,y) y #define D_ifB_1(x,y) x #define D_Bnot(b) D_if(b)(0,1) #define D_Bor(a,b) D_if(a)(1,b) #define D_Band(a,b) D_if(a)(b,0) #define D_Bxor(a,b) D_if(a)(D_Bnot(b),b) #define D_Beq(a,b) D_if(a)(b,D_Bnot(b)) #define D_N0 #define D_N1 1 #define D_N2 0 1 #define D_N3 1 1 #define D_N4 0 0 1 #define D_N5 1 0 1 #define D_N6 0 1 1 #define D_N7 1 1 1 #define D_N8 0 0 0 1 #define D_N9 1 0 0 1 #define D_NA 0 1 0 1 #define D_NB 1 1 0 1 #define D_NC 0 0 1 1 #define D_ND 1 0 1 1 #define D_NE 0 1 1 1 #define D_NF 1 1 1 1 #define D_addcomma_0 0, #define D_addcomma_1 1, #define D_addcomma_2 2, #define D_addcomma_3 3, #define D_addcomma_4 4, #define D_addcomma_5 5, #define D_addcomma_6 6, #define D_addcomma_7 7, #define D_addcomma_8 8, #define D_addcomma_9 9, #define D_addcomma_A A, #define D_addcomma_B B, #define D_addcomma_C C, #define D_addcomma_D D, #define D_addcomma_E E, #define D_addcomma_F F, #define D_addcomma_m m, #define D_head(list) D_head_2(D_cat(D_addcomma_,list)) #define D_head_2(x) D_head_3(x) #define D_head_3(a,b) a #define D_tail(list) D_tail_2(D_cat(D_addcomma_,list)) #define D_tail_2(x) D_tail_3(x) #define D_tail_3(a,b) b #define D_____EOL ,0 #define D_____SOL_D_____EOL ,1 #define D_nil_p(list) D_nil_p_2(list D_____EOL) #define D_nil_p_2(list) D_nil_p_3(D_____SOL_##list) #define D_nil_p_3(x) D_nil_p_4(x) #define D_nil_p_4(a,b) b #define D_Lor(list1,list2) D_if(D_nil_p(list1))(list2,list1) #define D_tail_or(list1,list2) D_tail(D_Lor(list1,list2)) #define D_head_or(list1,list2) D_head(D_Lor(list1,list2)) #include "d_while.h" #define D_reverse_p(list1,list2) D_Bnot(D_nil_p(list1)) #define D_reverse_f(list1,list2) (D_tail(list1),D_head(list1) list2) #define D_reverse(list) D_tuple2_2(D_whileZ(D_reverse_p, D_reverse_f, (list,))) #define D_Nplus_p(a,b,c,r) D_Bor(c,D_Bnot(D_Band(D_nil_p(a),D_nil_p(b)))) #define D_Nplus_f(a,b,c,r) D_Nplus_f_2(D_head_or(a,0),D_head_or(b,0),c,r,D_tail_or(a,0),D_tail_or(b,0)) #define D_Nplus_f_2(ha,hb,c,r,ta,tb) (ta,tb,D_Nplus_cn(ha,hb,c),r D_Nplus_dig(ha,hb,c)) #define D_Nplus(a,b) D_tuple4_4(D_whileZ(D_Nplus_p, D_Nplus_f, (a,b,0,))) #define D_Nplus_dig(a,b,c) D_Bxor(D_Bxor(a,b),c) #define D_Nplus_cn(a,b,c) D_if(D_Bxor(a,b))(c,a) #define D_Nlt_p_p(a,b,r) D_Bnot(D_Band(D_nil_p(a),D_nil_p(b))) #define D_Nlt_p_f(a,b,r) (D_tail_or(a,0),D_tail_or(b,0),D_Nlt_p_dig(D_head_or(a,0),D_head_or(b,0))(r)) #define D_Nlt_p_dig(a,b) D_Nlt_p_dig_2(a,b) #define D_Nlt_p_dig_2(a,b) D_Nlt_p_dig##a##b #define D_Nlt_p_dig00(r) r #define D_Nlt_p_dig11(r) r #define D_Nlt_p_dig01(r) 1 #define D_Nlt_p_dig10(r) 0 #define D_Nlt_p(a,b) D_tuple3_3(D_whileZ(D_Nlt_p_p, D_Nlt_p_f, (a,b,0))) #define D_Nlteq_p(a,b) D_tuple3_3(D_whileZ(D_Nlt_p_p, D_Nlt_p_f, (a,b,1))) #define D_Neq_p(a,b) D_Band(D_Nlteq_p(a,b),D_Nlteq_p(b,a)) #define D_ND_Dbl_p(a,r,c) D_Bor(c,D_Bnot(D_nil_p(a))) #define D_ND_Dbl_f(a,r,c)(D_tail_or(a,0),r D_N_toD_s(D_head_or(a,0),c)) #define D_ND_Dbl(a,c) D_tuple3_2(D_whileZ(D_ND_Dbl_p, D_ND_Dbl_f, (a,,c))) #define D_N_toD_s(a,c) D_N_toD_s_(a,c) #define D_N_toD_s_(a,c) D_N_toD_s##a##c #define D_N_toD_s00 0,0 #define D_N_toD_s01 1,0 #define D_N_toD_s10 2,0 #define D_N_toD_s11 3,0 #define D_N_toD_s20 4,0 #define D_N_toD_s21 5,0 #define D_N_toD_s30 6,0 #define D_N_toD_s31 7,0 #define D_N_toD_s40 8,0 #define D_N_toD_s41 9,0 #define D_N_toD_s50 0,1 #define D_N_toD_s51 1,1 #define D_N_toD_s60 2,1 #define D_N_toD_s61 3,1 #define D_N_toD_s70 4,1 #define D_N_toD_s71 5,1 #define D_N_toD_s80 6,1 #define D_N_toD_s81 7,1 #define D_N_toD_s90 8,1 #define D_N_toD_s91 9,1 #define D_N_toDlst_p(a,r) D_Bnot(D_nil_p(a)) #define D_N_toDlst_f(a,r) (D_tail(a), D_ND_Dbl(r,D_head(a))) #define D_N_toDlst(a) D_Lor(D_tuple2_2(D_whileY(D_N_toDlst_p, D_N_toDlst_f, (D_reverse(a),))),0) #define D_N_toDstr_p(a,r) D_Bnot(D_nil_p(a)) #define D_N_toDstr_f(a,r) (D_tail(a), D_cat(r,D_head(a))) #define D_N_toDstr(a) D_tuple2_2(D_whileZ(D_N_toDstr_p, D_N_toDstr_f, (D_reverse(D_N_toDlst(a)),))) #define D_fib_p(a,b,c,i) D_Nlt_p(i,c) #define D_fib_f(a,b,c,i) (b,D_Nplus(a,b),c,D_Nplus(i,D_N1)) #define D_fib(c) D_tuple4_2(D_whileY(D_fib_p, D_fib_f, (D_N0,1,c,D_N0))) D_N_toDstr(D_fib(D_N0)); D_N_toDstr(D_fib(D_N1)); D_N_toDstr(D_fib(D_N2)); D_N_toDstr(D_fib(D_N3)); D_N_toDstr(D_fib(D_N4)); D_N_toDstr(D_fib(D_N5)); D_N_toDstr(D_fib(D_N6)); D_N_toDstr(D_fib(D_N7)); D_N_toDstr(D_fib(D_N8)); D_N_toDstr(D_fib(D_N9)); D_N_toDstr(D_fib(D_NA)); D_N_toDstr(D_fib(D_NB)); D_N_toDstr(D_fib(D_NC)); D_N_toDstr(D_fib(D_ND)); D_N_toDstr(D_fib(D_NE)); D_N_toDstr(D_fib(D_NF));
d_while.h
#define D_whileY0(p,f,x) D_if(p x)(f x, x) #define D_whileY1(p,f,x) D_if(p x)(D_whileY0(p,f,D_whileY0(p,f,x)),x) #define D_whileY2(p,f,x) D_if(p x)(D_whileY1(p,f,D_whileY1(p,f,x)),x) #define D_whileY3(p,f,x) D_if(p x)(D_whileY2(p,f,D_whileY2(p,f,x)),x) #define D_whileY4(p,f,x) D_if(p x)(D_whileY3(p,f,D_whileY3(p,f,x)),x) #define D_whileY5(p,f,x) D_if(p x)(D_whileY4(p,f,D_whileY4(p,f,x)),x) #define D_whileY6(p,f,x) D_if(p x)(D_whileY5(p,f,D_whileY5(p,f,x)),x) #define D_whileY7(p,f,x) D_if(p x)(D_whileY6(p,f,D_whileY6(p,f,x)),x) #define D_whileY8(p,f,x) D_if(p x)(D_whileY7(p,f,D_whileY7(p,f,x)),x) #define D_whileY D_whileY8 #define D_whileZ0(p,f,x) D_if(p x)(f x, x) #define D_whileZ1(p,f,x) D_if(p x)(D_whileZ0(p,f,D_whileZ0(p,f,x)),x) #define D_whileZ2(p,f,x) D_if(p x)(D_whileZ1(p,f,D_whileZ1(p,f,x)),x) #define D_whileZ3(p,f,x) D_if(p x)(D_whileZ2(p,f,D_whileZ2(p,f,x)),x) #define D_whileZ4(p,f,x) D_if(p x)(D_whileZ3(p,f,D_whileZ3(p,f,x)),x) #define D_whileZ5(p,f,x) D_if(p x)(D_whileZ4(p,f,D_whileZ4(p,f,x)),x) #define D_whileZ6(p,f,x) D_if(p x)(D_whileZ5(p,f,D_whileZ5(p,f,x)),x) #define D_whileZ7(p,f,x) D_if(p x)(D_whileZ6(p,f,D_whileZ6(p,f,x)),x) #define D_whileZ8(p,f,x) D_if(p x)(D_whileZ7(p,f,D_whileZ7(p,f,x)),x) #define D_whileZ D_whileZ8
ãããå®è¡ããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
# 1 "main.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "main.c" # 98 "main.c" # 1 "d_while.h" 1 # 99 "main.c" 2 # 160 "main.c" 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987;
æåçã§ããâ¦ãããã¾ãã¡æåãèãã§ããâ¦
*1:Windowsã§ã¯åè¨å·