Подтвердить что ты не робот

Является ли функция() {} истинным quine?

После того, как я выкрикнул в интернете, я не смог найти никого, кто написал бы слово в R (Edit: с момента написания этого, нашел несколько на SO, но я все еще заинтересован в этом). Поэтому я подумал, что я попробую себя придумать. Мой результат был (удивительно коротким) кодом:

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()

в том, как они оба печатаются при запуске?

4b9b3361

Ответ 1

Вы не полностью понимаете, что происходит здесь. На самом деле код

function(){}

не делает ничего, кроме построения функции без аргументов и тела, возвращая ее и удаляя ее сразу же после ее возвращения. Его выход будет NULL, поэтому он не "воссоздает себя".

Вывод, который вы видите на консоли, не является результатом, заданным function(){}, а print.function. Это метод S3, который заботится о показе функционального объекта в консоли. Что вы на самом деле делаете, это:

a <- function(){}
print(a)
rm(a)

Истинный R quine будет примерно таким:

m<-"m<-0;cat(sub(0,deparse(m),m))";cat(sub(0,deparse(m),m))

См. также Wikipedia для этого и других примеров

Ответ 2

Это не настоящий quine, поскольку он ничего не печатает в stdout. Вся суть Куайна заключается в том, что он может воспроизводить себя путем печати. Программа должна создавать новый файл или выводить в stdout, содержащий его точный код.

Пример javascript quine:

(function a(){console.log(`(${a}())`)}())