我写了最少的C语言程序

2022-02-21 15:29:14

作为一个有趣的下午挑战,我决定写一个C程序,它看起来一点也不像C。不一定是模糊的,但如果你愿意的话,这是一个竞争对手。

不,相反,我在想,如果我把C语言变成一种完全不同的语言,然后用这种语言编写一个程序,然后用C编译器编译这个程序呢。对我来说,这听起来像是我能写的最少的C语言程序。

#包括";cpaint。h";变量a、b、c、h、i、l、v、x、y、q、w、p尺寸65535,包装n尺寸13꞉整数;过程显示(r,s,c);开始循环调用A(Z);称为H(y,x);呼叫B(Z)池;y꞉= R十、꞉= s呼叫A(c);称为H(y,x);呼叫B(c);调用refresh()结束;过程填充(y,x,c,a);如果(y<;0或y>;w-1或x<;0或x>;q-1或c=a或Z<a)填充开始꞉= -1.抽签(c);呼叫填充(y+1,x,c,a);呼叫填充(y-1、x、c、a);呼叫填充(y、x-1、c、a);调用填充(y,x+1,c,a)结束;过程保存(r,s);开始i꞉= 0 ; 而(i<;13)确实从n[i]开始꞉= 0 ; 我꞉= i+1结束呼叫移动(w>;>;1,(q>;>;1)-6);致电printw(";保存:";);调用echo();调用getnstr(n,12);调用noecho();呼叫开放(n,";w+";);呼叫writeChar(83);呼叫writeChar(w);呼叫writeChar(q);循环调用writeChar(Z)池;y꞉= R十、꞉= s通话结束;调用移动(y,x)结束;过程加载(打包n);开始调用打开;;电话查询;LOOP readln(c);呼叫抽签(c)池;c꞉= 0; 调用closeend;过程m();开始l꞉= 0 ; 五、꞉= 1.呼叫A(c);调用H(0,0);呼叫B(c);调用refresh();而(v)开始阅读(inp);和#39/':L꞉= 不是我;如果(l)提款(c);好的';k';:Y꞉= y-1;如果(y<;0)y꞉= 0 ; 如果(l)提款(c);好的';j';:Y꞉= y+1;如果(y>;w-1)y꞉= w-1;如果(l)提款(c);好的';h';:十、꞉= x-1;如果(x<;0)x꞉= 0 ; 如果(l)提款(c);好的';l';:十、꞉= x+1;如果(x>;q-1)x꞉= q-1;如果(l)提款(c);好的'':抽签(c);好的';c';:C꞉= c+1;如果(c=M)c꞉= 0 ; 好的';d';:抽签(15);好的';f';:呼叫填充(y、x、c、Z);好的';s';:调用save(y,x);好的';q';:五、꞉= 0 ; 好的';v';:C꞉= c-1;如果(c=N)c꞉= M-1;呼叫显示(y、x、c)结束;程序主(IC、打包ʌv);开始呼叫开始;调用getmaxyx(stdscr,w,q);如果(w>;M)w꞉= M如果(q>;M)q꞉= M调用start_color();虽然(x<;M)确实开始调用init_对(x,x,x);十、꞉= x+1结束;循环调用抽取(15)池;如果(c=2)调用负载(v[c-1]);通话显示(0,0,0);调用m();调用endwin()结束;调用main。

我听到你说的';你说";这实际上不是C语言。它具有Pascal语言的所有标记,分号作为语句分隔符而不是语句终止符,用于赋值的:=可能还有一些带循环的Algol。。池语法" 它甚至有Pascal风格的返回赋值,在这里,你给函数赋值,然后';s其返回值(请参见填充过程)。

抓住我了。我最近听说,A+、k和q语言(APL和J等数组编程语言)的作者Arthur Whitney将使用C预处理器创建自己的语言,然后用自定义语言编写语言的实现。我决定尝试做同样的事情。

我松散地将我的自定义语言基于PL/0,我们之前为其编写了一个编译器(是的,我知道我必须完成自托管博客系列;我会完成它)。

本练习的重点是C编译器将UTF-8字符理解为标识符的有效字符。我使用了很多看起来像ASCII的字符,但实际上不是ASCII,但仍然被接受为有效的标识符字符。C预处理器愉快地接受宏,这些宏将这些标识符转换为您需要的任何内容。你可以在这里看到隐藏的头文件。创造性地使用空格有助于完成它。

在短短的一个下午里,一切都很有趣。我可能赢了';不要再尝试这样的事情了。但是发现一些滥用C预处理器的有趣方法是很有趣的。

哦,如果你真的想使用这个程序,它';这是一个简单的终端绘制程序。