2015-11-03 5 views
11

После того, как я ткнулся в интернет, я не смог найти никого, кто написал бы слово в 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() 

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

+5

Я думаю, что это будет обман, потому что REPL неявно вызывает 'print()' для вас; ваш исходный код не печатает сам. – MrFlick

+1

Я никогда не слышал слова «quine», но функции R - это весело, может быть, что-то вроде 'f <- (function() this <- function() print (attr (this, 'srcref')))()' то 'f()' – jenesaisquoi

+1

Любое анонимное определение функции - это вопрос, следующий за вашей логикой. Фактически, функция, которую вы определяете, не выполняется, а просто печатается, как сказал @MrFlick. – nicola

ответ

0

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

Пример яваскрипта Куайном будет:

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

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

function(){} 

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

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

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

Истинный R Куайн будет что-то вроде этого:

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

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