В обычных языках написать
квайн довольно сложно. Умение написать квайн часто отличает суперкрутых программистов от просто крутых.
Квайн — это программа, которая выводит свой исходный код на печать. При этом она не имеет права использовать ввод (иначе всё было бы слишком просто).
Квайн на Немерле выглядит приблизительно так:
#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. это типа шутка
Здравствуйте, 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)
Здравствуйте, 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 () { .. }'
Здравствуйте, 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>
протупил. Добавил пробелы и заработало
Здравствуйте, 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)