После того, как я ткнулся в интернет, я не смог найти никого, кто написал бы слово в R (Edit: с момента написания этого, нашел несколько на SO, но меня все еще интересует этот). Поэтому я подумал, что я попробую себя придумать. Мой результат был (удивительно короткий) Код:Является ли функция() {} истинным quine?
function(){}
, который будет выводить function(){}
при запуске. Это использует тот факт, что имя функции без парсенов или аргументов после нее возвращает исходный код функции.
Однако программа, которая «смотрит на себя», обычно не считается истинным quine. Есть две вещи, которые я понял, я не понимаю, пытаясь решить, написал ли я «настоящий» quine: (1) Что представляет собой программа, «смотрящая на себя» (с точки зрения точки зрения), за исключением использования file i/o и (2) степень, в которой function(){}
(или аналогичные команды, такие как logical(0)
) являются самореляционными, когда они печатают себя. Первое кажется слишком субъективным для SO, но я надеялся на некоторое разъяснение по поводу последнего. Итак ...
Когда я запустил function(){}
, что именно происходит, что заставляет его печатать собственный «исходный код»? Например, R загружает пустую функцию в локальную среду, оценивая эту функцию, а затем оглядываясь на код, который определил ее для печати? Или, просто глядя на function(){}
и сразу же повторив его определение? Существует ли принципиальное различие между этим и
f<-function(){cat("f<-");print(f);cat("f()")}
f()
с точки зрения того, как они оба печатаются при запуске?
Я думаю, что это будет обман, потому что REPL неявно вызывает 'print()' для вас; ваш исходный код не печатает сам. – MrFlick
Я никогда не слышал слова «quine», но функции R - это весело, может быть, что-то вроде 'f <- (function() this <- function() print (attr (this, 'srcref')))()' то 'f()' – jenesaisquoi
Любое анонимное определение функции - это вопрос, следующий за вашей логикой. Фактически, функция, которую вы определяете, не выполняется, а просто печатается, как сказал @MrFlick. – nicola