変数なしでコードを書くことができます

非常によく、「まあ、たとえば、この言語には変数がなく、したがって...に問題はありません」などの精神のフレーズの後、対話者の目に完全な驚きに気づいて驚いています。 これは、多くのプログラマーが変数のようなものなしではプログラムを想像できないためです。 プレーンCでのそのようなコードの例を以下に翻訳します。



このコードは次のタスクを実行し、入力で4つの整数の配列を受け取り、それらが長方形の台形の4つの辺になるかどうかを判断します。



このコードは、効果的または表現力があると主張するものではなく、これが可能であるという事実の例としてのみ考慮されるべきです。 これは、言語もタスクもこのスタイルのプログラミングに寄与しないという事実によるものです。 これにもかかわらず、このコードの1つの強力な側面を強調できます。これらは明確に定義された抽象化です。



このリンクのジャーナル「Functional Programming Practice」の第1号のEvgeni Kirpichevによる記事「変数状態:危険とそれらとの戦い」で、変数について、および変数状態のより一般的な理解について読むことができます。

fprog.ru/2009/issue1/eugene-kirpichev-fighting-mutable-state



#include <stdio.h>



int find_dublicate( const int *lines)

{

return find_dublicate2(lines, 0, 0);

}



int find_dublicate2( const int *lines, const int i)

{

const int result = find_dublicate3(lines, i, i + 1);

if (result == -1)

if (i < 3) return find_dublicate2(lines, i + 1);

else return -1;

else return result;

}



int find_dublicate3( const int *lines,

const int i,

const int j)

{

if (lines[i] == lines[j])

return lines[j];

else

if (j < 4) return find_dublicate3(lines, i, j + 1);

else return -1;

}



int delete_duplicate( const int *lines, const int a, const int number)

{

return delete_duplicate2(lines, a, 0, 2, number);

}



int delete_duplicate2( const int *lines, const int a,

const int i, const int j, const int number)

{

if (lines[i] == a && j != 0)

delete_duplicate2(lines, a, i + 1, j - 1, number);

else if (number != 0)

delete_duplicate2(lines, a, i + 1, j, number - 1);

else return lines[i];

}





int max_AB( const int *AB)

{

if (AB[0] > AB[1]) return 0;

else return 1;

}



int main ( int argc, char ** argv)

{

const int lines[] = {2,3,8,2};

const int a = find_dublicate(lines);

if (a == -1) goto no;

const int AB[2] = {delete_duplicate(lines, a, 0), delete_duplicate(lines, a, 1)};



const int max = max_AB(AB);



const int delta = AB[max] - AB[max ? 0 : 1];

if (delta/2 < a) goto yes;

else goto no;



yes:

printf ( "yes\n" );

return 0;

no:

printf ( "no\n" );

return 0;



}



* This source code was highlighted with Source Code Highlighter .









#include <stdio.h>



int find_dublicate( const int *lines)

{

return find_dublicate2(lines, 0, 0);

}



int find_dublicate2( const int *lines, const int i)

{

const int result = find_dublicate3(lines, i, i + 1);

if (result == -1)

if (i < 3) return find_dublicate2(lines, i + 1);

else return -1;

else return result;

}



int find_dublicate3( const int *lines,

const int i,

const int j)

{

if (lines[i] == lines[j])

return lines[j];

else

if (j < 4) return find_dublicate3(lines, i, j + 1);

else return -1;

}



int delete_duplicate( const int *lines, const int a, const int number)

{

return delete_duplicate2(lines, a, 0, 2, number);

}



int delete_duplicate2( const int *lines, const int a,

const int i, const int j, const int number)

{

if (lines[i] == a && j != 0)

delete_duplicate2(lines, a, i + 1, j - 1, number);

else if (number != 0)

delete_duplicate2(lines, a, i + 1, j, number - 1);

else return lines[i];

}





int max_AB( const int *AB)

{

if (AB[0] > AB[1]) return 0;

else return 1;

}



int main ( int argc, char ** argv)

{

const int lines[] = {2,3,8,2};

const int a = find_dublicate(lines);

if (a == -1) goto no;

const int AB[2] = {delete_duplicate(lines, a, 0), delete_duplicate(lines, a, 1)};



const int max = max_AB(AB);



const int delta = AB[max] - AB[max ? 0 : 1];

if (delta/2 < a) goto yes;

else goto no;



yes:

printf ( "yes\n" );

return 0;

no:

printf ( "no\n" );

return 0;



}



* This source code was highlighted with Source Code Highlighter .









#include <stdio.h>



int find_dublicate( const int *lines)

{

return find_dublicate2(lines, 0, 0);

}



int find_dublicate2( const int *lines, const int i)

{

const int result = find_dublicate3(lines, i, i + 1);

if (result == -1)

if (i < 3) return find_dublicate2(lines, i + 1);

else return -1;

else return result;

}



int find_dublicate3( const int *lines,

const int i,

const int j)

{

if (lines[i] == lines[j])

return lines[j];

else

if (j < 4) return find_dublicate3(lines, i, j + 1);

else return -1;

}



int delete_duplicate( const int *lines, const int a, const int number)

{

return delete_duplicate2(lines, a, 0, 2, number);

}



int delete_duplicate2( const int *lines, const int a,

const int i, const int j, const int number)

{

if (lines[i] == a && j != 0)

delete_duplicate2(lines, a, i + 1, j - 1, number);

else if (number != 0)

delete_duplicate2(lines, a, i + 1, j, number - 1);

else return lines[i];

}





int max_AB( const int *AB)

{

if (AB[0] > AB[1]) return 0;

else return 1;

}



int main ( int argc, char ** argv)

{

const int lines[] = {2,3,8,2};

const int a = find_dublicate(lines);

if (a == -1) goto no;

const int AB[2] = {delete_duplicate(lines, a, 0), delete_duplicate(lines, a, 1)};



const int max = max_AB(AB);



const int delta = AB[max] - AB[max ? 0 : 1];

if (delta/2 < a) goto yes;

else goto no;



yes:

printf ( "yes\n" );

return 0;

no:

printf ( "no\n" );

return 0;



}



* This source code was highlighted with Source Code Highlighter .












PSコードは正常に動作しているようですが、通常はテストされていません。 コンパイル済みgcc-4.2.1

PPS一部の誤解では、変数とは、名前の付いたメモリではなく、変数の状態を持つオブジェクトを意味していました。



All Articles