Nemerle в действии: квайн-оператор
От: catbert  
Дата: 13.12.11 17:48
Оценка: 9 (2)
В обычных языках написать квайн довольно сложно. Умение написать квайн часто отличает суперкрутых программистов от просто крутых.
Квайн — это программа, которая выводит свой исходный код на печать. При этом она не имеет права использовать ввод (иначе всё было бы слишком просто).

Квайн на Немерле выглядит приблизительно так:
#pragma indent

def s = <##pragma indent

def s = <#{0}#>

System.Console.WriteLine(s, s)#>

System.Console.WriteLine(s, s)

Это если не использовать макросы, конечно. Но макросы именно для того и существуют, чтобы упрощать написание самого сложного кода. С макросом-оператором Quine эта задача сводится (как в HQ9+) к набору одного символа:
using Quine;q

Вот код макроса:
using Nemerle.Compiler;

namespace Quine
{
    public macro Quine() syntax ("q")
    {           
        def file = DefaultParser.ReadFile(
            Nemerle.Macros.ImplicitCTX().CurrentMethodBuilder.Location.File, 
            false, true);
        def text = file.GetText();
            
        <[ System.Console.WriteLine($(text : string)) ]>        
    }
}


P. S. это типа шутка
Re: Nemerle в действии: квайн-оператор
От: hardcase Пират http://nemerle.org
Дата: 14.12.11 08:04
Оценка:
Здравствуйте, catbert, Вы писали:

C>Квайн на Немерле выглядит приблизительно так:

C>
C>#pragma indent

C>def s = <##pragma indent

C>def s = <#{0}#>

C>System.Console.WriteLine(s, s)#>

C>System.Console.WriteLine(s, s)
C>

Прагма тут лишняя и лишь добавляет текст
def s=<#def s=<#{0}#>;System.Console.WriteLine(s, s)#>;System.Console.WriteLine(s, s)
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Nemerle в действии: квайн-оператор
От: BogdanMart Украина  
Дата: 15.12.11 13:03
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Прагма тут лишняя и лишь добавляет текст
H>
def s=<#def s=<#{0}#>;System.Console.WriteLine(s, s)#>;System.Console.WriteLine(s, s)


Ошибка компиляции!
q.n:1:6:1:9: ←[01;31merror←[0m: parse error near operator `=<#': expecting `def x = expr' or `def f () { .. }'
q.n:1:14:1:17: ←[01;31merror←[0m: parse error near operator `=<#': expecting `def x = expr' or `def f () { .. }'
Re[3]: Nemerle в действии: квайн-оператор
От: BogdanMart Украина  
Дата: 15.12.11 13:04
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Ошибка компиляции!

BM>
BM>q.n:1:6:1:9: ←[01;31merror←[0m: parse error near operator `=<#': expecting `def x = expr' or `def f () { .. }'
BM>q.n:1:14:1:17: ←[01;31merror←[0m: parse error near operator `=<#': expecting `def x = expr' or `def f () { .. }'
BM>


протупил. Добавил пробелы и заработало
Re[3]: Nemerle в действии: квайн-оператор
От: _NN_ www.nemerleweb.com
Дата: 15.12.11 13:06
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Здравствуйте, hardcase, Вы писали:

H>>Прагма тут лишняя и лишь добавляет текст
H>>
def s=<#def s=<#{0}#>;System.Console.WriteLine(s, s)#>;System.Console.WriteLine(s, s)


BM>Ошибка компиляции!

BM>
BM>q.n:1:6:1:9: ←[01;31merror←[0m: parse error near operator `=<#': expecting `def x = expr' or `def f () { .. }'
BM>q.n:1:14:1:17: ←[01;31merror←[0m: parse error near operator `=<#': expecting `def x = expr' or `def f () { .. }'
BM>


Это же очевидно.
Компилятор трактует =<# как оператор.

Нужно просто добавить пробел:
def s= <#def s= <#{0}#>;System.Console.WriteLine(s, s)#>;System.Console.WriteLine(s, s)
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.