Напишіть програму своєю улюбленою мовою іншою мовою [закрито]


168

Реальний програміст може писати програми Fortran будь-якою мовою.

від реальних програмістів Не використовуйте Pascal

Ваше завдання - написати програму мовою програмування за вибором, але ви можете використовувати лише іншу мову. Тобто викиньте всі умови кодування з однієї мови та замініть їх умовами кодування з іншої мови. Чим більше, тим краще. Зробіть так, щоб ваша програма виглядала так, ніби вона написана іншою мовою.

Наприклад, фанат Python, який ненавидить Java, може написати наступну програму Python на Java:

void my_function()                                                             {
    int i = 9                                                                  ;
    while(i>0)                                                                 {
        System.out.println("Hello!")                                           ;
        i = i - 1                                                              ;}}

Ентузіаст Паскаля, змушений використовувати C, міг написати це:

#define begin {
#define end }
#define then
#define writeln(str) puts(str)

if (i == 10) then
begin
    writeln("I hate C");
end

Ви повинні написати повну програму. Програма не повинна робити нічого корисного.

Щасти. Це конкурс популярності, тому виграє код з найбільшою кількістю голосів!


1
@ m.buettner створіть свій файл із розширенням .litcoffee. Це може допомогти.
Ісмаїл Мігель

Трохи довго (і раніше написаний, а не самодостатній) для відповіді, але: сканер Postscript в Postscript в C .
luser droog

51
Я не думаю, що ви (або більшість відповідей) розумієте суть цитати. Справа не в тому, що Реальний програміст пише код, який лексично виглядає як Фортран, хоча він пише на Паскалі чи ЛІСП: це те, що він застосовує фортранський спосіб мислення, навіть коли пише на Паскалі чи ЛІСП; напр., " Як знають усі реальні програмісти, єдиною корисною структурою даних є масив. " Відмінними відповідями були б процедурний код у Prolog, функціональний код на C, об'єктно-орієнтований код у Pascal.
Пітер Тейлор

1
Я сподіваюся, що хтось зробить діалект Ліспа, ну, що завгодно, крім іншого діалекту Ліспа ...
itsjeyd

6
Десяте правило програмування @itsjeyd Greenspun : "Будь-яка достатньо складна програма C або Fortran містить спеціальну, неофіційну інформацію, помилку, повільну реалізацію половини CommonLisp."
Джошуа Тейлор

Відповіді:


142

C в C ++

#include <stdio.h>

int main(int argc, char** argv)
{
        printf("Hello world!\n");
        return 0;
}

60
Я бачу, що ви там зробили;)
el.pescado

27
Що ж, це дешевий трюк, оскільки C ++ "назад сумісний" з C.
Agi Hammerthief

5
@AlexM. Я думаю, що це було б більше в дусі питання, якби це був більш тривалий (процедурний) приклад, який, безумовно, виграє від використання деяких класів і який використовує інші ідіоми C, де якась доброта STL була б набагато розумнішою (скажімо, char*замість std::string).
Мартін Ендер

47
Діє в C, C ++, Objective-C і Objective-C ++! Яка дивовижна поліглот відповідь.
nneonneo

7
@BenJackson Psh, використовують справжні програмісти C char *argv[]!
Томас

122

x86 збірка в GNU C

Ні, я не просто використав asmключове слово, оскільки питання, встановлене, це для справжніх програмістів ... це повинно працювати добре на ARM.

(Тільки для підтвердження суті , я взагалі не "записував" збірку - це результат, отриманий GCC Clang (503.0.38) для коментованого коду вгорі, сліпо переведеного на макроси.)

Це працює лише в 32-бітному режимі. Це добре, оскільки реальний програміст все-таки кодує розмір слова.

#include <stdio.h>
#include <stdint.h>
/*
int fac(int x) {
    if (x < 1) return 1; else return x * fac(x - 1);
}

int fib(int x) {
    if (x < 2) return x; else return fib(x - 1) + fib(x - 2);
}

int main(void) {
    int a = fib(10), b = fac(10);
    printf("%d %d\n", a, b);
    return 0;
}
*/

typedef union REG {
    intptr_t i; int _i; void * v; union REG * r;
} REG;

#define LPAREN (
#define RPAREN )
#define MACRO(N) ); N##_MACRO LPAREN

#define push MACRO(PUSH)
#define pop  MACRO(POP)
#define mov  MACRO(MOV)
#define sub  MACRO(SUB)
#define add  MACRO(ADD)
#define imul MACRO(IMUL)
#define cmp  MACRO(CMP)
#define jge  MACRO(JGE)
#define jmp  MACRO(JMP)
#define call MACRO(CALL)
#define ret  MACRO(RET) _
#define label MACRO(LABEL)

#define NO_OP(X) 

#define PUSH_MACRO(VAL) *(esp -= 4) = (REG)(VAL)
#define POP_MACRO(DST) (DST) = (typeof(DST))(esp->i); esp += 4
#define MOV_MACRO(VAL, DST) (DST) = (typeof(DST))((REG)VAL).i;
#define SUB_MACRO(VAL, DST) CMP_MACRO(VAL, DST); \
    (DST) = (typeof(DST))(((REG)DST).i - ((REG)VAL).i)
#define ADD_MACRO(VAL, DST) DST = (typeof(DST))(((REG)DST).i + ((REG)VAL).i); \
    ZF = ((REG)DST).i == 0; OF = 0; SF = ((REG)DST).i < 0
#define IMUL_MACRO(VAL, DST) DST = (typeof(DST))(((REG)DST).i * ((REG)VAL).i); \
    ZF = ((REG)DST).i == 0; OF = 0; SF = ((REG)DST).i < 0
#define CMP_MACRO(L, R) CMP_MACRO_(((REG)L).i, ((REG)R).i)
#define CMP_MACRO_(L, R) (OF = 0, ZF = L == R, SF = (R - L) < 0)
#define JGE_MACRO(TGT) if (SF == OF) { goto TGT; } else {}
#define JMP_MACRO(TGT) goto TGT;
#define CALL_MACRO(PROC) CALL_MACRO_(PROC, __COUNTER__)
#define CALL_MACRO_(PROC, CTR) PUSH_MACRO(CTR - STARTIP); \
    goto PROC; case CTR - STARTIP:
#define RET_MACRO(_) eip = esp->i; esp += 4; if (eip) { continue; } else { goto *finalreturn; }
#define LABEL_MACRO(NAME) NAME

#define MY_ASM(X) do { const int STARTIP = __COUNTER__; \
    switch(eip) { case 0: MY_ASM_1 X } } while (1);
#define MY_ASM_1(X) MY_ASM_2(NO_OP LPAREN 0 X RPAREN;)
#define MY_ASM_2(X) X

#define CAT(L, R) _CAT(L, R)
#define _CAT(L, R) L##R

#define callASM(F) callASM_(F, CAT(_TMP_, __COUNTER__))
#define callASM_(F, LABEL) (({ PUSH_MACRO(0); stackbase = esp; finalreturn = &&LABEL; \
    goto F; LABEL:; }), (intptr_t)eax)


const int STACKSIZE = 4096;
REG callstack[STACKSIZE], * stackbase;
REG * eax, * ecx, * edx, * ebx, * esi, * edi, * esp, * ebp;
int SF, ZF, OF, eip; void * finalreturn;

int main(void) {
    eax = ecx = edx = ebx = esi = edi = esp = ebp = &callstack[STACKSIZE - 1];
    eip = 0;
    finalreturn = &&TOP; TOP:

    PUSH_MACRO(10);
    int a = callASM(_fac);
    PUSH_MACRO(10);
    int b = callASM(_fib);

    printf("%d %d\n", a, b);
    return 0;


    MY_ASM((
    label _fac:                                   // @fac
        push ebp
        mov esp, ebp
        sub 24, esp
        mov 8[ebp], eax
        mov eax, (-8)[ebp]
        cmp 1, (-8)[ebp]
        jge LBB0_2
        mov 1, (-4)[ebp]
        jmp LBB0_3
    label LBB0_2:
        mov (-8)[ebp], eax
        mov (-8)[ebp], ecx
        sub 1, ecx
        mov ecx, *esp
        mov eax, (-12)[ebp]         // 4-byte Spill
        call _fac
        mov (-12)[ebp], ecx         // 4-byte Reload
        imul eax, ecx
        mov ecx, (-4)[ebp]
    label LBB0_3:
        mov (-4)[ebp], eax
        add 24, esp
        pop ebp
        ret

    label _fib:                                   // @fib
        push ebp
        mov esp, ebp
        sub 24, esp
        mov 8[ebp], eax
        mov eax, (-8)[ebp]
        cmp 2, (-8)[ebp]
        jge LBB1_2
        mov (-8)[ebp], eax
        mov eax, (-4)[ebp]
        jmp LBB1_3
    label LBB1_2:
        mov (-8)[ebp], eax
        sub 1, eax
        mov eax, *esp
        call _fib
        mov (-8)[ebp], ecx
        sub 2, ecx
        mov ecx, *esp
        mov eax, (-12)[ebp]         // 4-byte Spill
        call _fib
        mov (-12)[ebp], ecx         // 4-byte Reload
        add eax, ecx
        mov ecx, (-4)[ebp]
    label LBB1_3:
        mov (-4)[ebp], eax
        add 24, esp
        pop ebp
        ret
    ))
}

Подивіться на всі ці ролі. Касти означають, що я програміст- реалер, ніж компілятор, правда?


8
+1, це ... скручено. ;) Мені дуже подобається, як ти впорався call, зокрема.
Ільмарі Каронен

2
Ого. Це чудова робота.
Джек Едлі

У мене був асемблер для C64, який працював так. До нього додано ОСНОВНІ ключові слова для всіх інструкцій 6510, і я пам'ятаю, що ти обклав for pass=1:3...nextїї. Виконавши його в інтерпретаторі BASIC зібрав його.
Бен Джексон

5
Це чиста поезія.
Nicu Stiurca

1
Це жорстка людина, впевнений укладач.
Інтернети зроблені з Catz

102

Англійська мова на мові С

#include <stdio.h>
#define This
#define program     int main() {
#define aims
#define to
#define output      printf(
#define some
#define example
#define text(a)     #a
#define the
#define screen      "\n");
#define it          
#define also
#define will
#define calculate   ;int a = 
#define result
#define of
#define and
#define print       ; printf("%d\n", a);
#define seriously   return 0; }

This program aims to output some example text (Hello) to the screen;
it also will calculate the result of 3 + 4 and print the result; seriously

Будь-які ідеї усунути ;?


18
Серйозно, хлопці.
Кайл Странд

2
чому визначати theдвічі?
Джошуа Тейлор

16
краще безпечно, ніж вибачте ;-)
урзеїт

20
Тепер зробіть це хайку.
Nicu Stiurca

1
Можете ви#define . ;
mbomb007

74

Brainfuck в JavaScript

Javascript - важка мова! Давайте скористаємося Brainfuck, більш зрозумілою мовою: o)

eval(

//write your easy code below

"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."

//end of easy code

.replace(/\]/g,'}')
.replace(/\[/g,'while(a[i]){')
.replace(/\+/g,'a[i]++;')
.replace(/-/g,'a[i]--;')
.replace(/>/g,'i++;')
.replace(/</g,'i--;')
.replace(/\./g,'o+=String.fromCharCode(a[i]);')
.replace(/,/g,'a[i]=u.charCodeAt(j++);')
.replace(/^/,'var a=new Array(1000).join(\'0\').split(\'\'),i=500,o=\'\',u=prompt(\'Enter input if needed\'),j=0;')
.replace(/$/,'alert(o)')
)

Я здогадуюсь, я написав інтерпретатора в javascript у JavaScript.

Наведений вище приклад просто виводить з ладу Hello World!та ігнорує вхід (немає ,символу).
Але це працює і з входами! Наприклад, спробуйте ,+>,+>,+>,+<<<.>.>.>.ввести golfдіалогове вікно. Він виведе з ладу наступні символи таблиці ASCII:hpmg

EDIT : Коротке пояснення для людей, які не знають мозкових епізодів.
Уявіть нескінченний масив цілих чисел, aініціалізованих на нуль скрізь, вказівник на один елемент цього масиву iта введення користувача u.
Brainfuck дуже легко навчитися, але складно написати:

  • + приріст до поточного значення: a[i]++
  • - декременти: a[i]--
  • > робить для вказівки точок наступний елемент: i++
  • < попередній : i--
  • [і ]визначити цикл, який розривається, коли значення струму дорівнює нулю:while (a[i]) { ... }
  • . друкувати поточний елемент: String.fromCharCode(a[i])
  • , встановлює поточний елемент із введенням користувача: u.charCodeAt(...)

22
+1 за гумор, заявляючи, що мозковий ебать зрозуміліше, ніж JavaScript.
Agi Hammerthief

Ви впевнені, що символи Brainfuck всередині replaceвисловлювань не впливають на програму?
Fraxtil

3
@fra Цей файл не є мозковою програмою, це програма javascript, яка містить програму brainfuck, яка перетворюється на JavaScript під час виконання.
підземниймонорельс

3
Ну, --iшвидше, ніж i--? Здається неправдою з років: jsperf.com/decrementgolf .
Майкл М.

4
Це не тільки дуже творче подання на конкурс, але й дуже чітко пояснює синтаксис мозкових епізодів. +10, якби міг!
СебастьянH

74

Я думаю, геніальний Леннарт Авгуссон вже двічі перемагав у цьому.

По-перше, ось приклад його впровадження BASIC в якості "хак-вихідного" як Haskell Monadic DSL з 2009 року:

import BASIC

main = runBASIC' $ do

    10 LET I =: 1
    20 LET S =: 0
    30 LET S =: S + 1/I
    40 LET I =: I + 1
    50 IF I <> 100000000 THEN 30
    60 PRINT "Almost infinity is"
    70 PRINT S
    80 END

Він працює, перевантажуючи тип числа. Номери рядків - це дійсно функції, які приймають аргументи. Решта рядка - це аргументи функції. Функція повертає подання Абстрактного синтаксичного дерева для інтерпретатора BASIC, щоб продовжити роботу.

Я також рекомендую ознайомитись з участю Авгуссона на Міжнародному конкурсі затуманених С 2006 року, в якому йому вдалося втиснути в 4 к:

  • Інтерпретатор байт-кодів, написаний у підмножині С (який він називає Замкненим С).
  • Заплутаний C -> байткод компілятор, написаний в байткод.

Вони можуть ділитися тим самим файлом, оскільки байт-код розміщений усередині коментарів C.

Минуло кілька років, як я стежив за роботою Авґуссона, тож, можливо, знайдуться й інші геніальні речі, які він придумав з того часу….


2
Це Авгуссон, а не Аугусцен.
Ганс Лундмарк

@HansLundmark Дякую Виправлено це.
Пітару

71

PHP та Javascript

Це поліглот:

Цей код можна запустити на обох мовах:

if("\0"=='\0')
{
    function printf(){
        $b=Array();
        $a=$b['slice']['call'](arguments);
        $a=$a['join']('');
        console.log($a);
        return $a.length;
    };

    function strtoupper($s){return $s['toUpperCase']();}

    function count($a){return $a['length'];}
}

printf('this is cool!');

$c=Array('a','b','c','d');

for($i=0,$l=count($c);$i<$l;++$i)printf("\n",strtoupper($c[$i]));

Підступність у тому, що Javascript використовує послідовності втечі в рядках, починаючи з 'і ".
З іншого боку, PHP використовує лише рядки втечі в рядках, що починаються з "і <<<.

Потім ми оголошуємо функцію printf, яка схожа на, printале виводить сформовану рядок у PHP.

PHP вимагає, щоб варс починався $, а Javascript просто дозволяє.


Ніхто не використовує Array(…)в JS, і це очевидно array(…)в PHP. […]було б набагато краще;)!
Blackhole

12
Мене не хвилює , якщо люди використовують Array()в JS чи ні: я все одно , що у мене є ІСТИНА поліглот. Я роблю один із найстрашніших злочинів JS з цим кодом, але все, що я хочу, - це те, що він працює і робить те саме, що і в обох, але схожий на JS та PHP одночасно.
Ісмаїл Мігель

І btw, [...]недійсний у PHP <5.4.0, що погано ....... Якщо я кидаю це в PHP 4, 5 або Javascript, я очікую, що він спрацює, а не синтаксичні помилки скрізь.
Ісмаїл Мігель

2
Якщо ви хочете, щоб ваш код виглядав як JS, ви повинні використовувати […], що здається досить стандартним в PHP, і тому для вашої мети все нормально. І до речі, PHP <5,4? Час для поновлення, хлопець ...
Блекхол

8
Сумісність важливіша за "зовнішність". І Arrayце ПРАВА назва конструктора об'єкта Array. В основному використання []те саме, що і використання Array(). Я не бачу в цьому нічого поганого. Але у мене є одне просте запитання: працює? (btw, я повинен використовувати php 5.3.28 на роботі.)
Ісмаель Мігель

55

Мозговий ебать в JS

[][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[
!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[
+!+[]]]]][([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(
![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!
![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+
[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]
]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[
]+!+[]+!+[]+!+[]]]]+([][[]]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]+!+[]]]]+(!!
[]+[])[+[[+[]]]]+(!![]+[])[+[[+!+[]]]]+([][[]]+[])[+[[+[]]]]+([][(![]+[])[+[[
+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!
![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+
[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[
[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!!
[]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]
+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]((![]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+
[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]+(!![]+[])[+[[+[]]]
]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[
+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[
+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+[+!+[]]+([][(![]+[]
)[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]
]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+
[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]])()

12
Я не бачу тут жодного епізоду. Навіть ні одного чару><,.-
Майкл М.

8
@Michael: Хто сказав, що це не програма, яка робить нескінченний цикл?
Конрад Боровський

19
це JSF * ck?

8
Як на Землі , вона робить що ?
nandhp

4
Оо. Хтось нарешті це зробив. Я витратив деякий час, намагаючись зрозуміти, як написати програму JS, використовуючи лише символи +! [] (), Але ніколи не зміг це зрозуміти. Мені потрібно проаналізувати це, коли
встигну

54

Це один із переможців IOCCC 2005 року , програма C, яка, за винятком групи, визначена як програма java:

/*
 * Sun's Java is often touted as being "portable", even though my code won't
 * suddenly become uber-portable if it's in Java. Truth is, Java's one of
 * the most ugly, slow, and straitjacketed languages ever. It's popular
 * mainly because people hear the word "portable" and go "ewww".
 *
 * This program, then, is dedicated to bringing about the death of Java. We
 * good coders have been oppressed for too long by the lame language
 * decisions of pointy-haired bosses and academics who should know better. 
 * It's time we stand up against this junk, and bring back the fun in
 * programming! Viva La Revolution!
 */

#define aSet c
#define BufferedReader(x)1
#define byte Y[I][_^1]?do(:):_&1?do(.):do(`):8;++y;}
#define class int N=0,_,O=328,l=192,y=4,Y[80][64]={0},I;struct
#define do(c)a(#c "\b")
#define err c,c
#define getAllStrings(x));q()
#define if(x)b(#x)
#define IOException
#define line c
#define main(a)b(char*x){write(1,"\033[",2),null}main()
#define new
#define null a(x);}a(char*x){write(1,x,strlen(x));try;try;try;try;
#define out c,c
#define println(x)c
#define private int d(int
#define public short c;}c;typedef int BufferedReader;char*F="JF>:>FB;;BII";
#define return {return
#define static f(x){N=(N+x)%6,y--?f(0),f(1),f(4),f(1):++Y[(I=O+N[F]-66)
#define String
#define System c
#define this if(D):1,O=I,I/=16,l<_/32?if(B):l>_/32?if(A):2,l=_,_/=16,byte
#define throws
#define toArray(x)c
#define try for(;--c.c;)
#define void /16][(_=l+N[6+F]-66)/16]?O/=16,l/=32,O<I/16?if(C):O>I/16?this
#define while(k)if(2J),if(7;21H),f(0),f(4),f(4),if(H),/*

import java.io.*;
import java.util.*;

/**
 * A lame Java program.
 * @author  J. Random Worker
 */
class LameJavaApp
{

    /** The infamous Long-Winded Signature From Hell. */
    public static void main(String[] args)
        throws IOException
    {
        /* Don't get me started on this. */
        BufferedReader reader =
            new BufferedReader(new FileReader(args[0]));

        /* What, this long incantation just to print a string? */
        System.err.println("Hello world!");

        /* At least this is sane. */
        String line;
        while ((line = reader.readLine()) != null)
            System.out.println(line.length());
    }

    /**
     * Method with a needlessly long name.
     * @param   aSet        a set (!)
     */
    private String[] getAllStrings(Set<String> aSet)
    {
        /*
         * This dance is needed even in J2SE 5, which has type
         * templates. It was worse before that.
         */
        return aSet.toArray(new String[0]);
    }

}

3
Багатослівність у найкращих випадках.
qwr

39

C ++ в С

Гаразд, значить, ви програміст на C ++, але ви змушені використовувати C? Немає жодної проблеми. Вам потрібно лише написати кілька додаткових заголовків, відсутніх у C. Наприклад, ось дійсна програма Hello World на C:

У додатковий файл заголовка iostreamнапишіть:

#include <stdio.h>

#define using volatile int
#define namespace message
#define std = 0
#define message(x) printf("%s\n",x)
#define cout 0
#define endl 0

У файл stringзапишіть

#define string

У файл helloworld.c(власний код C) запишіть

#include <iostream>
#include <string>

using namespace std;

int main()
{
  string message("Hello world");
  cout << message << endl;
  return 0;
}

А під час компіляції helloworld.cз компілятором C доручіть компілятору також шукати <...>файли заголовків, де б ви не зберігали файли, iostreamі string, наприклад, якщо ви компілюєте з gcc та розміщуєте файли iostreamта stringв поточному каталозі, компілюйте з

gcc helloworld.c -o helloworld -I.

Примітка. В volatileзаголовку in iostreamє можливість включення без попередження компіляції навіть на максимальному рівні попередження (читання з мінливої ​​змінної вважається таким, що має ефект).


3
Це трохи тролінгу коду, чи не так.
Містер Лістер

Що ж, програма робить саме те, що, здається, робить, чи не так?
celtschk

8
Настільки смішніше і вражаючіше, ніж C у C ++.
Кайл Странд

Який тип компілятора попереджає, якщо ви не використовуєте volatileтут, і яке попередження?
Р. Мартіньо Фернандес

1
@KyleStrand Але "C у C ++" більше співзвучний із цитатою у питанні. Справжні програмісти програмують на C, навіть якщо вони мають компілятор C ++.
Містер Лістер

36

CQL - мова запитів з кофеїном

(або "SQL на кофеїн")

Це, можливо, було дещо надмірно амбітним. Ось спроба записати декларативний код SQL (ish) в CoffeeScript . Для цього потрібна функція проксі-сервера ECMAScript 6 . Ви можете перевірити його у вузлі за допомогою --harmony-proxies.

Давайте налаштуємо шаблон для визначення проксі. (Взято з коментаря Бенві до цього питання )

forward = (->
  _slice  = Array.prototype.slice
  _bind   = Function.prototype.bind
  _apply  = Function.prototype.apply
  _hasOwn = Object.prototype.hasOwnProperty

  Forwarder = (target) ->
    @target = target
    this

  Forwarder.prototype =
    getOwnPropertyNames: -> Object.getOwnPropertyNames(@target)
    keys: -> Object.keys(@target)
    enumerate: ->
      i = 0
      keys = []
      for value of @target
        keys[i++] = value
      keys
    getPropertyDescriptor: (key) ->
      o = @target;
      while o
        desc = Object.getOwnPropertyDescriptor o, key
        if desc
          desc.configurable = true;
          return desc;

        o = Object.getPrototypeOf o
    getOwnPropertyDescriptor: (key) ->
      desc = Object.getOwnPropertyDescriptor @target, key
      if desc
        desc.configurable = true
      desc
    defineProperty: (key, desc) -> Object.defineProperty @target, key, desc
    get: (receiver, key) -> @target[key]
    set: (receiver, key, value) ->
      @target[key] = value;
      true
    has: (key) -> key of @target
    hasOwn: (key) -> _hasOwn.call @target, key
    delete: (key) ->
      delete @target[key]
      true
    apply: (receiver, args) -> _apply.call @target, receiver, args
    construct: (args) -> new (_bind.apply @target, [null].concat args);

  forward = (target, overrides) ->
    handler = new Forwarder target;
    for k of Object overrides
      handler[k] = overrides[k]

    if typeof target is 'function'
      return Proxy.createFunction handler,
                                  -> handler.apply this, _slice.call arguments,
                                  -> handler.construct _slice.call arguments
    else
      return Proxy.create handler, Object.getPrototypeOf Object target

  forward
)();

Тепер визначте проксі-об'єкт та деякі підозрілі глобальні змінні та функції:

sql = forward {
  tables: {}

  finalize: ->
    if typeof @activeRows isnt 'function'
      @result = []
      for row in @activeRows
        @result.push (val for val, i in row when @activeTable.columns[i] in @activeColumns)
    delete @activeRows
    delete @activeColumns
    delete @activeTable

  run: (q) ->
    q.call(this)
    @finalize()
    result = @result
    delete @result
    if typeof result isnt 'function' then console.log result
    return result
}, {
  get: (o,name) ->
    if name of @target
      return @target[name];
    (args...) -> {
      name
      args
    }
}

int = Number
varchar = (l) -> String

TABLE = (x) -> x
INTO = (x) -> x
CREATE = (tableData) ->
  name = tableData.name
  table =
    columns: []
  column = tableData.args[0]
  table[column.name] = []
  table.columns.push(column.name)
  while column = column.args[1]
    table[column.name] = []
    table.columns.push(column.name)

  sql.tables[name] = table

  sql.result = "Created table '#{name}'"

INSERT = (table) -> sql.activeTable = sql.tables[table().name]
VALUES = (rows...) ->
  for row in rows
    for val, i in row
      column = sql.activeTable.columns[i]
      sql.activeTable[column].push val

  sql.result = "Inserted #{rows.length} rows"

FROM = (table) ->
  sql.activeTable = sql.tables[table().name]
SELECT = (columns...) ->
  sql.activeColumns = []
  for col in columns
    if typeof col is 'function'
      col = col()

    sql.activeColumns.push col.name

  sql.activeRows = []
  for val in sql.activeTable[sql.activeTable.columns[0]]
    sql.activeRows.push []

  for col in sql.activeTable.columns
    for val, i in sql.activeTable[col]
      sql.activeRows[i].push val

IN = (list) -> { op: 'in', list }
WHERE = (column) ->
  i = sql.activeTable.columns.indexOf(column.name)
  if column.args[0].op is 'in'
    list = column.args[0].list
    sql.activeRows = (row for row in sql.activeRows when row[i] in list)
  else
    console.log 'Not supported!'

ASC = 'asc'
DESC = 'desc'
BY = (x) -> x
ORDER = (column) ->
  i = sql.activeTable.columns.indexOf(column.name)
  order = if column.args[0] is sql.ASC then 1 else -1
  sql.activeRows.sort (a,b) ->
    if a[i] < b[i]
      return -order
    else if a[i] > b[i]
      return order
    else
      return 0

Ну, це було досить багато налаштування! Але тепер ми можемо зробити наступне (введення / виведення в консольному стилі):

> sql.run ->
    CREATE TABLE @books(
      @title varchar(255),
      @author varchar(255),
      @year int
    );

Create Table 'books'

> sql.run ->
    INSERT INTO @books
    VALUES ['The C++ Programming Language', 'Bjarne Stroustrup', 1985],
           ['Effective C++', 'Scott Meyers', 1992],
           ['Exceptional C++', 'Herb Sutter', 2000],
           ['Effective STL', 'Scott Meyers', 2001];

Inserted 4 rows

> sql.run ->
    SELECT @title, @year FROM @books
    WHERE @author IN ['Bjarne Stroustrup', 'Scott Meyers']
    ORDER BY @year DESC;

[ [ 'Effective STL', 2001 ],
  [ 'Effective C++', 1992 ],
  [ 'The C++ Programming Language', 1985 ] ]

Це не власне поліглот, але це насправді не сенс. Я знаю, що @використовується для змінних у SQL, але мені потрібні всі @s для імен стовпців та таблиць, тому що я не знайшов способу проксі глобального об’єкта (і я не здивуюся, якщо це дійсно неможливо - і для вагома причина).

Я також змінив деякі дужки в дужки (зокрема після VALUESі IN). На жаль, те, що я взагалі не міг зрозуміти, це спосіб дозволити звичайні умови, як-отyear > 2000 , тому що вони відразу б оцінили булеву форму.

Однак це схоже на SQL і, безумовно, більш декларативне, ніж імперативне / функціональне / об'єктно-орієнтоване, тому воно повинно добре відповідати на питання. Я насправді думаю, що якщо я трохи відполірував код і підтримав ще кілька функцій, це може бути корисним модулем CoffeeScript.

У всякому разі, це було весело! :)

Для тих, хто не надто знайомий з CoffeeScript, SQL запити компілюються у такий JavaScript:

sql.run(function() {
  return CREATE(
    TABLE(
      this.books(
        this.title(varchar(255), 
        this.author(varchar(255), 
        this.year(int)))
      )
    )
  );
});

sql.run(function() {
  INSERT(INTO(this.books));
  return VALUES([...], ['Effective C++', 'Scott Meyers', 1992], [...], [...]);
});

sql.run(function() {
  SELECT(this.title, this.year(FROM(this.books)));
  WHERE(this.author(IN(['Bjarne Stroustrup', 'Scott Meyers'])));
  return ORDER(BY(this.year(thisESC)));
});

Це досить багато налаштувань, але виглядає добре. Я не програміст CoffeeScript, але це виглядає чудово. @У SQL використовується для змінних сеансу.
Ісмаїл Мігель

Я вирішив зробити ключові слова зараз глобальними. Тепер є лише @s для імен стовпців та таблиць.
Мартін Ендер

Зараз це дуже схоже на SQL! Ви зробили гарну роботу з цим!
Ісмаїл Мігель

1
Мені мало подобається кава, але це приголомшливо.
KRyan

2
@tac дякую, але ні, я просто зламав це разом для цього виклику. Кумедний збіг обставин: переробляти це чистим способом і розміщувати його на GitHub було в моєму списку потенційних / довгострокових програм кодування, поки я не усунув його лише сьогодні вранці.
Мартін Ендер

27

Visual Basic 6 (у JavaScript)

'; Main sub-routine \
'; function Main() { ' \
Sub Main() '
    ' Do not throw any errors... \
    On Error Resume Next '; MsgBox = alert

    ' Show a message box... \
    MsgBox(1 / 0) '

    ' Show errors again... \
    On Error GoTo 0 '

    ' Show another message box... '
    MsgBox("Hello")
    ' ' } ' \
End Sub '

Main()

Він також працює у VBScript.


1
Розумний. Вам навіть не потрібна більшість крапок з комою.
js1568

@ js1568 Дякую! Зараз я видалив напівколонки, які не потрібні.
Зубна щітка

20

F # в C ++

Швидше необразливе і бридке зловживання препроцесором. Я подумав, що було б цікаво змінити C ++, щоб він виглядав як абсолютно різний мова, а не використовував кілька псевдонімів, щоб він виглядав як Java або PHP. Я не дуже сподіваюсь, що це заробить багато грошей, це просто-для задоволення.

#define let int
#define args ( int __, char* args[] ) { int ___ 
#define println printf(
#define exit "\n" ); return 0; }
#include <stdio.h>

let main args =
    println "F# is better than C++"
    exit

Спробуйте тут .

На жаль написати щось до STDOUT - це все, що він може зробити, хоча я впевнений, якщо хтось накине на нього достатньо чаклунства, вони могли б змусити це зробити більше.


2
Щоб останній рядок працював у F #, він повинен був бути exit 0або просто 0.
Jwosty

20

Python і ... ніхто не здогадається (редагувати: dc)

Ось якийсь дійсний код python, але насправді програма написана зовсім іншою мовою:

# Initialize systems 1 and 2
# frame 1, divergency speed and divergency latency
f1ds, f1dl, z1 = [2,2,0]
# frame 2, divergency speed and divergency latency
f2ds, f2dl, z2 = [4,4,1]

# Set the most relevant value of ax (detected by low-energy collision)
ax = 42.424242

# Initialize list of successive energy states
s = [17.98167, 21.1621, 34.1217218, 57.917182]

# Most common value for nz parameter
# TODO: check if value from the article of A. Einstein is better
nz = 10

if z2>nz or ax in s:
  ax += 6
  f1ds = 8
  f2ds = 16
  z1 = 4
  z2 = 9

f1dl += z1
f2dl += z2

# main loop, iterate over all energy states
# Warning: hit Ctrl-C if nuclear explosion occurs and adjust either z or nz
for k in s:
  z = nz + k
  f1dl = f1ds + f2dl * z - z1 + 3.14
  f2dl = f2ds + f1dl * z - z2 + 10
  if k > 10 or z-2 in s:
    nz += 0xac  # hexadecimal coefficient found in famous article by E. Fermi

Код працює на обох мовах без помилок.

Поєднання дуже божевільне; Я був би радий зачекати день чи два, перш ніж розповісти, яка інша мова; будь ласка, залиште коментарі для здогаду.

ред .: Мова була мовою на основі стека від dc. Ви можете побачити тут добре відомі ключові слова , як for, if, or, in, але тільки букви значення! ,, Який не має ніякого значення в постійному включенні в регістр , тому що в перший раз він з'являється після листаs (те ж саме для :).


1
Якщо код не робить те саме на обох мовах, я вважаю, що мова на зразок Befunge могла б зробити свою справу.
Томас Едінг

Гаразд, я редагую код, щоб ввести мову, яку я насправді обрав.
Томас Баручель

18

C ++ дозволяє писати код, схожий на лісп, за допомогою бібліотеки InteLib:

(L|DEFUN, ISOMORPHIC, (L|TREE1, TREE2),
   (L|COND, 
     (L|(L|ATOM, TREE1), (L|ATOM, TREE2)),
     (L|(L|ATOM, TREE2), NIL),
     (L|T, (L|AND,
       (L|ISOMORPHIC, (L|CAR, TREE1), 
                      (L|CAR, TREE2)),
       (L|ISOMORPHIC, (L|CDR, TREE1), 
                      (L|CDR, TREE2))
 )))).Evaluate();

пор. http://www.informatimago.com/articles/life-saver.html


4
Ласкаво просимо! Ми просимо користувачів позначати свої публікації як Community Wiki, коли відповідь - це не їхня робота. (І дайте належну атрибуцію, але ви вже це зробили, тож дякую!)
Джонатан Ван Матре

Оригінально чи ні, ти отримав мій голос :)
itsjeyd

15

C # у Whitespace

Гаразд, спершу спробуйте один із них, тож давайте подивимось, як це відбувається.

using System; //very important  

namespace ConsoleApplication1  //namespace: name whatever you want      
{ 
 //start    
 class  Program  //class name:  also anything    
    {
    //main function 
    static void Main(string[] args) {
        for(int i=0;i<10;i++)   writeOutput(i); 
    } //end main    
    static void writeOutput(int i) { Console.WriteLine(i); }    //display output    


    } //class ends here         

}  //close namespace:   also very important     





//yay!

І якщо форматування пішло нерозумно від необхідності ставити чотири пробіли в передній частині кожного рядка, ось воно знову з. для місця та # для вкладки:

using.System;.//very.important#

namespace.ConsoleApplication1..//namespace:#name.whatever.you.want##
{.
.//start#
.class#Program..//class.name:#also.anything#.
#{
....//main.function#
#static.void.Main(string[].args).{
....#for(int.i=0;i<10;i++)#writeOutput(i);#
#}.//end.main#
#static.void.writeOutput(int#i).{.Console.WriteLine(i);.}#//display.output#

.
.#}.//class.ends.here.##

}..//close.namespace:#also.very.important#.#
.




//yay!

12

HTML та CSS

Не мови програмування, але… цей документ є дійсним HTML та CSS:

<!-- p{color:red} /* -->
<!Doctype html>
<title>This is HTML and CSS</title>
<p>Hi!</p>
<!-- */ -->
<!-- p{color:red} /* -->
<!Doctype html>
<title>This is HTML and CSS</title>
<p>Hi!</p>
<!-- */ -->

Це працює, оскільки коментарі HTML дозволені в таблицях стилів з історичних причин. О, і кожен дійсний документ HTML також є дійсною програмою PHP, тому це також PHP . :)


2
Це досить смішно, і все, але це насправді не поліглот .
Мартін Ендер

Оскільки CSS можна вважати завершеним , це може бути правильною відповіддю.
Адам Девіс

2
HTML і CSS не є мовами програмування :)
Jet

9

С у Скалі

Містковий шар імітує більш романтичну епоху, коли рядки все ще були нульовими завершеними масивами байтів.

// Scala is a dynamic language
import scala.language.{ dynamics, postfixOps }

val self = this

val argc = args.length
val argv = args.map(_.getBytes)

type char = Array[Byte]
object char extends Dynamic {
  // This program uses expanded memory
  val buffers = new scala.collection.mutable.LinkedHashMap[String, char]

  // Malloc char buffer
  def applyDynamic(name: String)(length: Int) =
    buffers(name) = new Array(length)

  def **(argv: Array[Array[Byte]]) = argv
}

object & extends Dynamic {
  // dereference char pointer
  def selectDynamic(name: String) = char.buffers(name)
}

def printf(format: String, buffers: char*) =
  println(
    (format /: buffers){ case (msg, buffer) =>
      // Read string until \0 terminator
      val value = new String(buffer.takeWhile(0 !=))
      // Replace next %s token
      msg.replaceFirst("%s", value)
    }
  )

def scanf(format: String, buffers: char*) =
  buffers foreach { buffer =>
    val line = Console.readLine()
    // Write string to char* buffer
    line.getBytes(0, line.length, buffer, 0)
    // Remember to always null terminate your strings!
    buffer(line.length) = 0
  }

val PATH_MAX = 4096

implicit class Argumenter(args: Pair[_, _]) {
  def apply[T](f: => T) = f
}

object int {
  // Passthrough
  def main[T](f: => T) = f
  def argc = self.argc
}

// terminates the string after the first character
// investigate switching to "xor eax, eax" instead of having a hardcoded 0
// might save 3 bytes and valuable CPU time with this trick
val initialize = (_: char)(1) = 0

def exit(value: Int) = sys.exit(value)
// ---HOMEWORK-ASSIGNMENT-START---

int main(int argc, char **argv) {
  if (argc != 0) {
    printf("This program does not take parameters!");
    exit(1);
  }

  // I've copy pasted this code from somewhere
  // Code reuse is essential if we want to be DRY
  char first(PATH_MAX + 1);
  char last(PATH_MAX + 1);

  printf("Enter your first and last name:\n");
  scanf("%s%s", &first, &last);

  // Still learning references, do I need these here?
  // I've performed benchmarks on printf and I think it's faster this way
  printf("Your full name is %s %s", &first, &last);

  initialize(&first);
  printf("Your signature is %s. %s", &first, &last);

  exit(0);
}

"This program does not take parameters!"обдурив вас
Ерік Позашляховик

8

sed і APL

Мій бос хоче, щоб я писав сценарії sed, але мені подобається весь день писати APL. Тим не менш, він дуже задоволений моєю роботою, тому що такі сценарії відмінно справляються з його версією sed:

i ← g ← 42
a ← d ← 10
s/s←2⊤42/s←2⊤43/g
s/s[01]*1/s⊣1/g
g

Ви можете спробувати це на моєму новому веб-сайті за допомогою цієї постійної посилання . Це компільована у javascript версія GNU APL. Остаточний реліз буде пізніше з офіційним випуском GNU APL, v. 1.3, але ви можете ідеально використовувати його для постійних посилань, якщо вам подобається GNU APL.


7

C в Хаскелл

import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Array
import Foreign.Ptr
import System.Environment
import System.Exit

-- The meat of the program

cmain :: (CInt, Ptr (Ptr CChar)) -> IO CInt
cmain(argc, argv) = do {
    putStr("hello, world\n");
    return 0;
}

-- Of course, the above function doesn't do anything unless we write a wrapper
-- around it.  This could have been done more simply, using higher-level library
-- functions, but where's the fun in that?

main :: IO ()
main = do {
    args <- getArgs;
    argPtrs <- sequence [do {
        argPtr <- mallocArray0(length(arg)) :: IO (Ptr CChar);
        pokeArray0(0)(argPtr)(map(castCharToCChar)(arg));
        return argPtr;
    } | arg <- args ];
    argv <- mallocArray(length(argPtrs)) :: IO (Ptr (Ptr CChar));
    pokeArray(argv)(argPtrs);

    exitCode <- cmain(fromIntegral(length(args)),argv);

    if (exitCode == 0) then do {
        exitWith(ExitSuccess);
    } else do {
        exitWith(ExitFailure(fromIntegral(exitCode)));
    };
}

Звичайно, оскільки cmainнічого не робить з argcабо argv, код аргументу аргументу не має ефекту, і оскільки cmainзавжди повертає 0, гілка "else" оператора "якщо" мертва. Але заява "якщо" все одно нічого не робить.

Усі фігурні дужки та крапки з комою є непотрібними, як і більшість дужок та деякі doключові слова. Заява "якщо" могла бути записана як if exitCode == 0 then exitWith ExitSuccess else exitWith (ExitFailure (fromIntegral exitCode)).


7

C ++ у Forth

: #include ; : <iostream> ; : { ; : } ; : int ; : using ;
: namespace ; : std; ; : main() ; : cout ; : << ;
: "Hello,  ; : world!\n"; S" Hello, world!" type ; : return ; : 0; ;

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, world!\n";
}

Не найскладніше рішення, але воно працює, якщо написано точно так, як показано.


7

Haskell на Java

("ванільна" Java 7, а не Java 8) (Так, я знаю, що бокс руйнує продуктивність; і навіть намагаючись використовувати функції вищого порядку отримує божевільний багатослівний: D)

У Java дуже жорсткий синтаксис, тому замість зміни синтаксису я спробував зробити код семантично більш схожим на стиль Haskell.

Редагувати - додано додатки часткової функції.

import java.util.Iterator;

interface Function1<A, B> {
    A call(B arg);
}

interface Function2<A, B, C> {
    A call(B arg1, C arg2);
}

class Reduce<A> implements Function2<A, Function2<A, A, A>, Iterable<A>> {

    @Override
    public A call(Function2<A, A, A> arg1, Iterable<A> arg2) {
        final Iterator<A> i = arg2.iterator();
        A r = i.next();
        while (i.hasNext())
            r = arg1.call(r, i.next());
        return r;
    }
}

class Range implements Iterable<Integer> {

    private final int min;
    private final int max;

    public Range(int min, int max) {
        this.min = min;
        this.max = max;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int i = min;

            @Override
            public boolean hasNext() {
                return i <= max;
            }

            @Override
            public Integer next() {
                return i++;
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }
}

public class Main {

    public static <A, B, C> Function1<A, C> applyPartial(final Function2<A, B, C> f, final B arg2) {
        return new Function1<A, C>() {
            @Override
            public A call(C arg) {
                return f.call(arg2, arg);
            }
        };
    }

    public static void main(String[] args) {

        final Function1<Integer, Iterable<Integer>> product = applyPartial(new Reduce<Integer>(), new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer arg1, Integer arg2) {
                return arg1 * arg2;
            }
        });

        final Function1<Integer, Integer> fact = new Function1<Integer, Integer>() {

            @Override
            public Integer call(Integer arg) {
                return product.call(new Range(1, arg));
            }
        };

        final Integer x = fact.call(6);

        System.out.println(x.toString());
    }
}

(Так, все це безумство - це обчислення 6!)


6

COBOL в AWK

У дусі цитати. Чистий, непорушений AWK, як це може бути написано програмістом COBOL.

Завдання - підрахувати записи на файл. Ця рання версія розробки зараховує себе до тестування. Правильний файл буде жорстко закодований пізніше, коли буде випущений з Unit Testing ...

Якби мені вдалося виділити синтаксис, щоб зробити фосфоресцентно-зелений на чорному, було б чудово ...

Навіть правильні номери стовпців у цьому коректному, це сім пробілів на початку кожного рядка (ніколи цього не робилося в розбігу) і розбиття довгих операторів друку в колонці 72.

   BEGIN { 
       PERFORM_000_INITIALISATION() 
       PERFORM_100_OPEN_FILES() 
       PERFORM_200_PROCESS_FILE() 
       PERFORM_300_CLOSE_FILES() 
       PERFORM_400_SHOW_THE_COUNTS() 
       exit 
   } 
   function PERFORM_000_INITIALISATION() { 
       INPUT_FILE_NAME = "COBOL.AWK" 
       RECORD_COUNT = 0 
   } 
   function PERFORM_100_OPEN_FILES() { 
   } 
   function PERFORM_200_PROCESS_FILE() { 
       PERFORM_210_PRIMING_READ() 
       PERFORM_220_PROCESS_INPUT_UNTIL_END() 
   } 
   function PERFORM_300_CLOSE_FILES() { 
   } 
   function PERFORM_400_SHOW_THE_COUNTS() { 
       print "COBOL.AWK: NUMBER OF RECORDS READ IS " RECORD_COUNT        
   } 
   function PERFORM_210_PRIMING_READ() { 
       PERFORM_900_READ_THE_FILE() 
       if ( FILE_STATUS < 0 ) { 
           print "COBOL.AWK ERR0001: INVALID FILE, HALTING, FILE N" \
                 "AME IS: " INPUT_FILE_NAME 
           exit 
           } 
       if ( FILE_STATUS == 0 ) { 
           print "COBOL.AWK ERR0002: NO RECORDS ON INPUT, HALTING," \
                 "FILE NAME IS: " INPUT_FILE_NAME 
           exit 
           } 
   } 
   function PERFORM_220_PROCESS_INPUT_UNTIL_END() {
       while ( FILE_STATUS != 0 ) { 
           INPUT_RECORD = $0 
           RECORD_COUNT = RECORD_COUNT + 1 
           PERFORM_900_READ_THE_FILE() 
           } 
   } 
   function PERFORM_900_READ_THE_FILE() { 
       FILE_STATUS = getline < INPUT_FILE_NAME 
   }        

6

Brainfuck (або що-небудь ще) в Racket

Гнучкий модуль і макросистема Racket дозволяє йому реалізувати підтримку модулів для абсолютно нових мов, як доменних, так і загальних цілей. Підтримка Datalog та Algol 60 існує нестандартно , тому наведені нижче є обома дійсними програмами:

#lang datalog
edge(a, b). edge(b, c). edge(c, d). edge(d, a).
path(X, Y) :- edge(X, Y).
path(X, Y) :- edge(X, Z), path(Z, Y).
path(X, Y)?

#lang algol60
begin
  integer procedure SIGMA(x, i, n);
    value n;
    integer x, i, n;
  begin
    integer sum;
    sum := 0;
    for i := 1 step 1 until n do
      sum := sum + x;
    SIGMA := sum;
  end;
  integer q;
  printnln(SIGMA(q*2-1, q, 7));
end

Ви також можете додати підтримку для інших мов: наприклад, див опис Danny Yoo, як реалізувати підтримку Brainfuck, яка дозволяє програми Racket, такі як:

#lang planet dyoo/bf
++++++[>++++++++++++<-]>.
>++++++++++[>++++++++++<-]>+.
+++++++..+++.>++++[>+++++++++++<-]>.
<+++[>----<-]>.<<<<<+++[>+++++<-]>.
>>.+++.------.--------.>>+.

Оскільки підтримка додається на рівні складеного модуля, можливо зв'язати модулі, написані різними мовами, або вставити фрагмент однієї мови всередині модуля, написаного на іншій.


5

SML на Java

У мене все ще є давній код, коли я почав вивчати Java і намагався використовувати його у функціональному стилі. Трохи прибираємо:

/**
 * Genericised ML-style list.
 */
public class FunctionalList<T> 
{
    private final T head;
    private final FunctionalList<T> tail;

    public FunctionalList(T x, FunctionalList<T> xs) {
        this.head = x;
        this.tail = xs;
    }

    public static <T> FunctionalList<T> cons(T x, FunctionalList<T> xs) {
        return new FunctionalList<T>(x, xs);
    }

    public static <T> T hd(FunctionalList<T> l) {
        return l.head;
    }

    public static <T> FunctionalList<T> tl(FunctionalList<T> l) {
        return l.tail;
    }

    public static int length(FunctionalList<?> l) {
        return len(l, 0);
    }

    private static int len(FunctionalList<?> l, int n) {
        return l == null ? n : len(tl(l), n + 1);
    }

    public static <T> FunctionalList<T> rev(FunctionalList<T> l) {
        return rev(l, null);
    }

    private static <T> FunctionalList<T> rev(FunctionalList<T> a, FunctionalList<T> b) {
        return a == null ? b : rev(tl(a), cons(hd(a), b));
    }

    public static <T> FunctionalList<T> append(FunctionalList<T> a, FunctionalList<T> b) {
        return a == null ? b : cons(hd(a), append(tl(a), b));
    }
}

5

Java в Perl

Може вважатися порушенням правил, але мені все одно. Очевидно, він призначений виглядати як програма Java. Він друкує 20 цифр Фібоначчі, якщо це не очевидно.

Потрібно встановити модуль Inline :: Java .

use Inline Java => <<'JAVA';
/**
 * @author  Konrad Borowski <x.fix@o2.pl>
 * @version 0.1.0
 */
class Fibonacci
{
    /**
     * Responsible for storing the number before last generated number.
     */
    private long beforeLastNumber = 0;

    /**
     * Responsible for storing the last generated number.
     */
    private long lastNumber = 1;

    /**
     * Receives the next Fibonacci number.
     * 
     * @return long integer that is the next Fibonacci number
      */
    public long next()
    {
        long temponaryLastNumber = lastNumber;
        lastNumber = beforeLastNumber + lastNumber;
        beforeLastNumber = temponaryLastNumber;
        return temponaryLastNumber;
    }

    /**
     * Outputs the Fibonacci number to standard output.
     */
    public void printFibonacci()
    {
        System.out.println(next());
    }

    /**
     * Outputs the Fibonacci number to standard output given number of
     * times.
     * 
     * @param times number of times to print fibonacci number
     */
    public void printFibonacciTimes(int times)
    {
        int i;
        for (i = 0; i < times; i++) {
            printFibonacci();
        }
    }

    /**
     * Constructor for Fibonacci object. Does nothing.
     */
    public Fibonacci()
    {
        // Do nothing.
    }
}
JAVA

###
 # The executable class that shows 20 Fibonacci numbers.
 ##
package OutputFibonacci
{
    ###
     # Shows 20 Fibonacci numbers. This method is public,
     # static, and returns void.
     ##
    sub main()
    {
        # In Perl, -> is object method separator, not a dot. This is stupid.
        new Fibonacci()->printFibonacciTimes(20);
    }
}

# Perl doesn't automatically call main method.
OutputFibonacci::main();

4

J і ... ніхто не здогадається (редагувати: dc)

Це мій другий запис; ось фрагмент дійсного J-коду, який повертає 1:

10 o. 1 r. 2 i. 4 [ ( 0:`1: @. (2&|)) ] 8 #: *:@+: 42

Я чекаю один-два дні, перш ніж розповісти, яка інша мова, яка виконує той самий фрагмент коду без помилок. Просто залишайте коментарі для спроб відгадати.

редагувати: Іншою мовою є мова, що базується на стеці, з дуже давнього калькулятора Unix DC.


3
Працює без помилок у GolfScript, BF, HQ9 +, ...
Пітер Тейлор

Гаразд, я не знав, що так багато мов можуть це зробити. Я редагую код, щоб ввести мову, яку я насправді обрав.
Томас Баручель

@ ברוכאל працює без помилок на цих мовах, оскільки ці мови не мають помилок або не мають помилок, застосовних до цього коду. Напр. Brainfuck ігнорує всіх персонажів, яких немає, .,+-<>[]тому ваша програма еквівалентна ...[.]+у brainfuck, що є дійсною, але безглуздою програмою. Програма AFAIK нахабна програма може бути недійсною лише при невідповідності [].
іммібіс

@immibis. Це помилково. DC - це старий калькулятор, і я можу запевнити, що зміна однієї речі в моїх кодах призведе до помилки. Я витратив багато часу на деякі частини коду, щоб з'ясувати якийсь хитромудрий спосіб введення літер у правильному порядку. Мій фрагмент коду Postscript / dc є надзвичайно екстремальним: жодна помилка, але що-небудь змінивши, зробить це несправним. dc не має нічого спільного з "тими мовами"; dc приблизно на 20 або 30 років старший за "ці мови"; він, як правило, встановлюється на будь-якому дистрибутиві Linux. Будь ласка, перегляньте трохи, якщо ви про це не чули.
Томас Баручель

1
@ ברוכאל ви неправильно зрозуміли - я говорив про brainfuck, HQ9 +, гольфскрипт тощо - не на постійному рівні.
іммібіс

4

DC, що працює з файлом PostScript

DC може виконувати наступний фрагмент коду без помилок:

10 10 10 10 10 42 32 10 10
stop % first send a stop
0 0 srand rand
le pop pop 3.14 sin
lt 2 3 lt and pop
le 2 10 le xor
pop pop pop 1 0 0
<< /sox 2 >> [ exch begin sox end ] aload
3.14 floor

3

ML / (Строгий) Haskell на Java

Це з реального реального проекту. Він використовує стійкі незмінні структури даних і використовує рекурсію, навіть коли це не потрібно. Насправді це більше схоже на Kore (мову, яку реалізує проект) на Java, але стиль в основному такий же, як ML. Але філософія Коре полягає в тому, що автор не повинен форматувати свій код, тому жоден Java-код також не форматований (він автоматично відформатоване затемненням).

видалити n елементів зі списку :

  public static <T> List<T> drop(List<T> l, Integer n) {
    return n == 0 ? l : drop(l.cons().tail, n - 1);
  }

У ML / Haskell, де ви збираєтеся відповідати зразком, щоб витягти голову та хвіст, ось ви скажете list.cons().xі list.cons().tail.

вставити елемент у список :

  public static <T> List<T> insert(List<T> l, Integer i, T x) {
    if (i == 0)
      return cons(x, l);
    return cons(l.cons().x, insert(l.cons().tail, i - 1, x));
  }

Список визначається буквально, як би визначався алгебраїчний тип даних. Ось версія зі знятою котловою плитою, що генерується затемненням:

public final class List<T> {

  public static final class Nil<T> {
  }

  public static final class Cons<T> {
    public final T x;
    public final List<T> tail;

    public Cons(T x, List<T> tail) {
      if (x == null)
        throw new RuntimeException("null head");
      if (tail == null)
        throw new RuntimeException("null tail");
      this.x = x;
      this.tail = tail;
    }
  }

  private final Nil<T> nil;
  private final Cons<T> cons;

  private List(Nil<T> nil, Cons<T> cons) {
    this.nil = nil;
    this.cons = cons;
  }

  public boolean isEmpty() {
    return nil != null;
  }

  public Nil<T> nil() {
    if (nil == null)
      throw new RuntimeException("not nil");
    return nil;
  }

  public Cons<T> cons() {
    if (cons == null)
      throw new RuntimeException("not cons");
    return cons;
  }

  public static <T> List<T> cons(Cons<T> cons) {
    if (cons == null)
      throw new RuntimeException("constructor received null");
    return new List<T>(null, cons);
  }

  public static <T> List<T> nil(Nil<T> nil) {
    if (nil == null)
      throw new RuntimeException("constructor received null");
    return new List<T>(nil, null);
  }
}

Ось структура даних карт, реалізована з точки зору трие :

public final class Map<K, V> {
  private final Tree<Character, Optional<Pair<K, V>>> tree;
  // keys are sorted in reverse order so entrySet can use cons instead of append
  private final Comparer<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> comparer =
      new PairLeftComparer<Character, Tree<Character, Optional<Pair<K, V>>>>(
          new ReverseComparer<Character>(new CharacterComparer()));

  private Map(Tree<Character, Optional<Pair<K, V>>> tree) {
    this.tree = tree;
  }

  public static <K, V> Map<K, V> empty() {
    return new Map<K, V>(new Tree<Character, Optional<Pair<K, V>>>(
        OptionalUtils.<Pair<K, V>> nothing(),
        ListUtils
            .<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> nil()));
  }

  public Optional<V> get(K k) {
    Tree<Character, Optional<Pair<K, V>>> t = tree;
    for (char c : k.toString().toCharArray()) {
      Tree<Character, Optional<Pair<K, V>>> t2 = getEdge(t, c);
      if (t2 == null)
        return nothing();
      t = t2;
    }
    if (t.v.isNothing())
      return nothing();
    return some(t.v.some().x.y);
  }

  public Map<K, V> put(K k, V v) {
    return new Map<K, V>(put(tree, k.toString(), v, k));
  }

  private Tree<Character, Optional<Pair<K, V>>> put(
      Tree<Character, Optional<Pair<K, V>>> t, String s, V v, K k) {
    if (s.equals(""))
      return new Tree<Character, Optional<Pair<K, V>>>(some(Pair.pair(k, v)),
          t.edges);
    char c = s.charAt(0);
    Tree<Character, Optional<Pair<K, V>>> t2 = getEdge(t, c);
    if (t2 == null)
      return new Tree<Character, Optional<Pair<K, V>>>(
          t.v,
          sort(
              cons(
                  pair(
                      c,
                      put(new Tree<Character, Optional<Pair<K, V>>>(
                          OptionalUtils.<Pair<K, V>> nothing(),
                          ListUtils
                              .<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> nil()),
                          s.substring(1), v, k)), t.edges), comparer));
    return new Tree<Character, Optional<Pair<K, V>>>(t.v, sort(
        replace(pair(c, put(t2, s.substring(1), v, k)), t.edges), comparer));
  }

  private List<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> replace(
      Pair<Character, Tree<Character, Optional<Pair<K, V>>>> edge,
      List<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> edges) {
    if (edges.cons().x.x.equals(edge.x))
      return cons(edge, edges.cons().tail);
    return cons(edges.cons().x, replace(edge, edges.cons().tail));
  }

  // I consider this O(1). There are a constant of 2^16 values of
  // char. Either way it's unusual to have a large amount of
  // edges since only ASCII chars are typically used.
  private Tree<Character, Optional<Pair<K, V>>> getEdge(
      Tree<Character, Optional<Pair<K, V>>> t, char c) {
    for (Pair<Character, Tree<Character, Optional<Pair<K, V>>>> p : iter(t.edges))
      if (p.x.equals(c))
        return p.y;
    return null;
  }

  public Map<K, V> delete(K k) {
    return new Map<K, V>(delete(tree, k.toString()).x);
  }

  private Pair<Tree<Character, Optional<Pair<K, V>>>, Boolean> delete(
      Tree<Character, Optional<Pair<K, V>>> t, String k) {
    if (k.equals(""))
      return pair(
          new Tree<Character, Optional<Pair<K, V>>>(
              OptionalUtils.<Pair<K, V>> nothing(), t.edges), t.edges.isEmpty());
    char c = k.charAt(0);
    Tree<Character, Optional<Pair<K, V>>> t2 = getEdge(t, c);
    if (t2 == null)
      return pair(t, false);
    Pair<Tree<Character, Optional<Pair<K, V>>>, Boolean> p =
        delete(t2, k.substring(1));
    List<Pair<Character, Tree<Character, Optional<Pair<K, V>>>>> edges = nil();
    for (Pair<Character, Tree<Character, Optional<Pair<K, V>>>> e : iter(t.edges))
      if (!e.x.equals(c))
        edges = cons(e, edges);
    if (!p.y)
      return pair(
          new Tree<Character, Optional<Pair<K, V>>>(t.v, cons(pair(c, p.x),
              edges)), false);
    boolean oneEdge = t.edges.cons().tail.isEmpty();
    return pair(new Tree<Character, Optional<Pair<K, V>>>(t.v, edges), oneEdge
        && t.v.isNothing());

  }

  public static class Entry<K, V> {
    public Entry(K k, V v) {
      this.k = k;
      this.v = v;
    }

    public final K k;
    public final V v;

  }

  public List<Entry<K, V>> entrySet() {
    return entrySet(ListUtils.<Entry<K, V>> nil(), tree);
  }

  private List<Entry<K, V>> entrySet(List<Entry<K, V>> l,
      Tree<Character, Optional<Pair<K, V>>> t) {
    if (!t.v.isNothing()) {
      Pair<K, V> p = t.v.some().x;
      l = cons(new Entry<K, V>(p.x, p.y), l);
    }
    for (Pair<Character, Tree<Character, Optional<Pair<K, V>>>> e : iter(t.edges))
      l = entrySet(l, e.y);
    return l;
  }
}

Типи починають займати стільки місця, скільки і код. Наприклад, кажучи , у методі є 302 символи типів та 343 символи коду (не рахуючи пробілів / нових рядків).


2

ОСНОВНІ в Рубі

Це реалізовано давно. Джерело знаходиться на GitHub . Натхненний подібною річчю у Scala

Налаштування

#!/usr/bin/env ruby

if caller.empty? && ARGV.length > 0
  $file = ARGV[0]
else
  $file = caller.last.split(':').first
end

require 'pp'

class String
  def %(other)
    self + other.to_s
  end
end

class RBaysick
  @@variables = {}
  @@code = []
  @@line = 0

  def initialize(contents)
    $DONT_RUN = true # To avoid endless loops.

    contents.gsub!(/( |\()'([^\W]+)/, '\1:\2 ')

    contents.gsub!(/(^| |\()(:[^\W]+)/, '\1GET(\2)')

    contents.gsub!(/ IF (.*) THEN (.*)/, ' IF { \1 }.THEN { GOTO \2 }')
    contents.gsub!(/LET *\(([^ ]+) *:= *(.*)\)/, 'LET(\1) { \2 }')
    contents.gsub!(/(LET|INPUT)(\(| )GET\(/, '\1\2(')
    contents.gsub!(/ \(/, '(')

    contents.gsub!(/^(\d+) (.*)$/, 'line(\1) { \2 }')

#    contents.gsub!(/(\)|\}|[A-Z]) ([A-Z]+)/, '\1.\2')

    contents.gsub!(/ END /, ' __END ')
    contents.gsub!(/^RUN/, '__RUN')

    puts contents if $DEBUG
    eval contents
  end

  def __RUN
    while @@line > -1
      puts "#{@@line}: #{@@code[@@line].inspect}" if $DEBUG
      unless @@code[@@line].nil?
        @@increment = true
        @@code[@@line].call
        next unless @@increment
      end
      @@line += 1
    end
  end

  class If < Struct.new(:value)
    def THEN
      yield if value
    end
  end

  def method_missing(name, *args)
    puts "Missing: #{name.to_s}(#{args.map(&:inspect).join(', ')})" if $DEBUG
  end

  def variables
    @@variables
  end

  def line(line, &block)
    @@code[line] = block
  end

  def add(line, cmd, *args)
    puts "DEBUG2: #{cmd.to_s}(#{args.map(&:inspect).join(', ')})" if $DEBUG
    @@code[line] = send(cmd, *args)
  end

  def IF
    ::RBaysick::If.new(yield)
  end

  def PRINT(str)
    puts "PRINT(#{str.inspect})" if $DEBUG
    puts str
    true
  end

  def LET(name, &block)
    puts "LET(#{name.inspect}, #{block.inspect})" if $DEBUG
    @@variables[name] = block.call
  end

  def GET(name)
    puts "GET(#{name.inspect}) #=> #{@@variables[name].inspect}" if $DEBUG
    @@variables[name]
  end

  def INPUT(name)
    puts "INPUT(#{name.inspect})" if $DEBUG
    LET(name) { $stdin.gets.chomp.to_i }
  end

  def ABS(val)
    puts "ABS(#{val.inspect}) #=> #{val.abs.inspect}" if $DEBUG
    val.abs
  end

  def GOTO(line)
    @@increment = false
    @@line = line
  end

  def __END
    exit
  end
end

RBaysick.new(open($file).read) unless $DONT_RUN || ($0 != __FILE__)

БАЗОВИЙ код

#!./rbaysick.rb

10 PRINT "Welcome to Baysick Lunar Lander v0.0.1"
20 LET ('dist := 100)
30 LET ('v := 1)
40 LET ('fuel := 1000)
50 LET ('mass := 1000)

60 PRINT "You are a in control of a lunar lander."
70 PRINT "You are drifting towards the surface of the moon."
80 PRINT "Each turn you must decide how much fuel to burn."
90 PRINT "To accelerate enter a positive number, to decelerate a negative"

100 PRINT "Distance " % 'dist % "km, " % "Velocity " % 'v % "km/s, " % "Fuel " % 'fuel
110 INPUT 'burn
120 IF ABS('burn) <= 'fuel THEN 150
130 PRINT "You don't have that much fuel"
140 GOTO 100
150 LET ('v := 'v + 'burn * 10 / ('fuel + 'mass))
160 LET ('fuel := 'fuel - ABS('burn))
170 LET ('dist := 'dist - 'v)
180 IF 'dist > 0 THEN 100
190 PRINT "You have hit the surface"
200 IF 'v < 3 THEN 240
210 PRINT "Hit surface too fast (" % 'v % ")km/s"
220 PRINT "You Crashed!"
230 GOTO 250
240 PRINT "Well done"

250 END

RUN

2

Haskell в шаблонах C ++

Я зробив цей FizzBuzz в шаблонах C ++ кілька місяців тому на жайворонку. Це майже реалізація наступного коду Haskell, і все це в шаблонах C ++. Насправді навіть ціла арифметика повторюється на рівні типу --- зауважте, що жоден із шаблонів не використовує параметри int!

Код Haskell:

import Control.Monad

m `divides` n = (n `mod` m == 0)

toFizzBuzz n
    | 15 `divides` n = "FizzBuzz"
    |  5 `divides` n = "Buzz"
    |  3 `divides` n = "Fizz"
    |      otherwise = show n

main = mapM_ putStrLn $ take 100 $ map toFizzBuzz [1..]

і версія метапрограмування шаблону C ++:

//  
//  Lazy compile-time fizzbuzz computed by C++ templates,
//  without conditionals or the use of machine arithmetic.
//
//         -- Matt Noonan (mnoonan@grammatech.com)

#include <iostream>

using namespace std;

//
//  The natural numbers: Nat = Zero | Succ Nat
//

template <typename n>
struct Succ
{
  typedef Succ eval;
  static const unsigned int toInt = 1 + n::toInt;
  static void print(ostream & o) { o << toInt; }
};

struct Zero
{
  typedef Zero eval;
  static const unsigned int toInt = 0;
  static void print(ostream & o) { o << toInt; }
};

//
//  Arithmetic operators
//    Plus Zero n = n
//    Plus Succ(n) m = Plus n Succ(m)
//    Times Zero n = Zero
//    Times Succ(n) m = Plus m (Times n m)
//

template <typename a, typename b>
struct Plus
{
  typedef typename Plus<typename a::eval,
                        typename b::eval>::eval eval;
};

template <typename M>
struct Plus <Zero, M>
{ typedef typename M::eval eval; };

template <typename N, typename M>
struct Plus <Succ<N>, M>
{ typedef typename Plus<N, Succ<M> >::eval eval; };

template <typename a, typename b>
struct Times
{
  typedef typename Times<typename a::eval,
                         typename b::eval>::eval eval;
};

template <typename M>
struct Times <Zero, M>
{ typedef Zero::eval eval; };

template <typename N, typename M>
struct Times <Succ<N>, M>
{ typedef typename Plus<M,
                        typename Times<N,M>::eval
                        >::eval eval; };

//
//  Lists
//

struct Nil
{
  typedef Nil eval;
  static void print(ostream & o) { }
};

template <typename x, typename xs>
struct Cons
{
  typedef Cons eval;
  static void print(ostream & o) {
    x::eval::print(o); o << endl; xs::eval::print(o);
  }
};

//
//  Take the first n elements of a list
//

template <typename, typename> struct Take;

template <typename _> struct Take<Zero,_>
{ typedef Nil eval; };

template <typename n, typename x, typename xs>
struct Take<Succ<n>, Cons<x,xs> >
{
  typedef Cons<x, Take<n, xs> > eval;
};

template <typename a, typename b>
struct Take
{
  typedef typename Take<typename a::eval,
                        typename b::eval>::eval eval;
};

//
//  Iterate f x0 makes the infinite list
//  x0, f(x0), f(f(x0)), ...
//

template <template<typename> class f, typename x0> struct Iterate
{
  typedef Cons<x0, Iterate<f, f<x0> > > eval;
};

//
//  Map a function over a list
//

template <template<typename> class a, typename b> struct Map
{ typedef typename Map<a,
                       typename b::eval>::eval eval;
};

template <template<typename> class f>
struct Map<f, Nil>
{ typedef Nil eval; };

template <template<typename> class f, typename x, typename xs>
struct Map<f, Cons<x,xs> >
{
  typedef Cons<f<x>, Map<f,xs> > eval;
};

//
//  Some useful things for making fizzes and buzzes
//

struct Fizz
{ static void print(ostream & o) { o << "Fizz"; } };

struct Buzz
{ static void print(ostream & o) { o << "Buzz"; } };

struct FizzBuzz
{ static void print(ostream & o) { o << "FizzBuzz"; } };

//
//  Some useful numbers
//

typedef Succ<Zero> One;
typedef Succ<One> Two;
typedef Succ<Two> Three;
typedef Plus<Two, Three> Five;
typedef Times<Two, Five> Ten;
typedef Times<Three, Five> Fifteen;
typedef Times<Ten, Ten> OneHundred;

//
//  Booleans
//

struct True {};
struct False {};

//
//  If/then/else
//

template <typename p, typename t, typename f>
struct If
{
  typedef typename If<typename p::eval, t, f>::eval eval;
  static void print(ostream & o) { eval::print(o); }
};

template <typename t, typename _>
struct If<True, t, _>
{
  typedef t eval;
};

template <typename _, typename f>
struct If<False, _, f>
{ typedef f eval; };

//
//  Testing if x divides y
//

template <typename a, typename b, typename c>
struct _Divides
{
  typedef typename _Divides<typename a::eval,
                            typename b::eval,
                            typename c::eval>::eval eval;
};

template <typename _, typename __>
struct _Divides<_, __, Zero> { typedef False eval; };

template <typename a>
struct _Divides<a, Zero, Zero> { typedef True eval; };

template <typename a, typename b>
struct _Divides<a, Zero, b>
{
  typedef typename _Divides<a, a, b>::eval eval;
};

template <typename _, typename n, typename m>
struct _Divides<_, Succ<n>, Succ<m> >
{
  typedef typename _Divides<_, n, m>::eval eval;
};

template <typename a, typename b>
struct Divides
{
  typedef typename _Divides<a, a, b>::eval eval;
};

//
//  "Otherwise" sugar
//

template <typename a>
struct Otherwise
{
  typedef typename a::eval eval;
  static void print(ostream & o) { a::eval::print(o); }
};

//
//  Convert a number to fizzes, buzzes as appropriate
//

template <typename n>
struct toFizzBuzz
{
  typedef typename
    If< Divides<Fifteen, n>, FizzBuzz,
    If< Divides<   Five, n>,     Buzz,
    If< Divides<  Three, n>,     Fizz,
    Otherwise<                   n
    > > > >::eval eval;
};

int main(void)
{
  // Make all of the natural numbers
  typedef Iterate<Succ, One> Naturals;

  // Apply fizzbuzz rules to every natural number
  typedef Map<toFizzBuzz, Naturals> FizzBuzzedNaturals;

  // Print out the first hundred fizzbuzzed numbers
  Take<OneHundred, FizzBuzzedNaturals>::eval::print(cout);

  return 0;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.