あなたの仕事は、非常に巧妙なライブラリを実装するか、入力テキストを処理したり、コンパイルプロセスを微調整することによって、プログラミング言語に機能を追加することです。
アイデア:
- PHPスタイルのプレゼンテーションインターリーブをCに追加します(例:)
<?c printf("Hello,"); ?> world!
。 - C#以外の言語の1つにヌル合体演算子を追加します。
- PHPにマクロを追加します。
goto
JavaScriptに追加します。- 言語Xにパターンマッチングを追加します。
- 名前空間のサポートを持たない言語に追加します。
- CをPHPのように見せます。
- HaskellをPascalのように見せます。
- ...(コメントセクションにアイデアを投稿してください)
ルール:
- テーブルに何かを持ってきてください。Haskellにメタプログラミング機能を追加するために「テンプレートHaskell」と言うだけではありません。これはStackOverflowではありません。
- 実装全体が1画面に収まる必要があります(例をカウントしません)。
- このタスク専用の外部サイトでコードをホストしないでください。
- 最も印象的または驚くべき機能が勝ちます。
機能を100%正しく実装することを心配しないでください。それからほど遠い!主な課題は、何をしたいのかを把握し、詳細を慎重に切り捨てることです。、計画された事業が実行可能になるまで。
例:
ラムダ演算子を追加するCプログラミング言語にをます。
最初のアプローチ:
さて、libgcを使用して、ラムダが上向きおよび下向きfunarg問題を解決するようにしたいと思います。私が最初にやらなければならないことは、Cプログラミング言語のパーサーを記述/検索することであり、その後、Cの型システムについてすべてを学ぶ必要があると思います。型が行く限り、それを理解する方法を理解する必要があります。型推論を実装する必要がありますか、それとも単に仮パラメータを指定どおりに入力する必要がありますか CIのこれらのクレイジーな機能がまだ知らないのはどうですか?
Cでラムダを正しく実装することは大きな仕事であることは明らかです。正確さを忘れてください!簡素化、簡素化。
より良い:
上向きのfunargsをねじ込みます、誰がそれらを必要としますか?GNU Cのネストされた関数とステートメント式を使用して、トリッキーなことができるかもしれません。簡潔でハックなコードを使用して、Cでの驚くべき構文変換を披露したかったのですが、これにはパーサーも必要ありません。それは別の日を待つことができます。
結果(GCCが必要):
#include <stdio.h>
#include <stdlib.h>
#define lambda(d,e)({d;typeof(e)f(d){return(e);};f;})
#define map(F,A)({typeof(F)f=(F);typeof(*(A))*a=(A);({int i,l=((int*)(a))[-1]; \
typeof(f(*a))*r=(void*)((char*)malloc(sizeof(int)+l*sizeof(*r))+sizeof(int)); \
((int*)r)[-1]=l;for(i=0;i<l;i++)r[i]=f(a[i]);r;});})
#define convert_to(T) lambda(T x, x)
#define print(T, fmt) lambda(T x, printf(fmt "\n", x))
int main(void)
{
int *array = 1 + (int[]){10, 1,2,3,4,5,6,7,8,9,10};
map(print(int, "%d"), array);
double *array2 = map(lambda(int x, (double)x * 0.5), array);
map(print(double, "%.1f"), array2);
long *array3 = map(convert_to(long), array2);
map(print(long, "%ld"), array3);
long product = 1;
map(lambda(int x, product *= x), array);
printf("product: %ld\n", product);
return 0;
}
それは簡単でしたね。私もに投げmap
、それは便利できれいにするマクロ。