2015-11-03 19 views
11

İnternette dolaştıktan sonra, R'de bir sorgu yazmış olan birini bulamadım (Düzenleme: bunu yazdığınızdan bu yana, SO üzerinde birkaç tane buldum, ama hala bununla ilgileniyorum). Bu yüzden elimden gelme konusunda elimi denediğimi düşündüm.İşlev() {} gerçek bir quine mı?

function(){} 

çıktısı function(){} çalışma: My sonuç (şaşırtıcı kısa) kodu oldu. Bu işlev, işlevin kaynak kodunu döndükten sonra, parens veya argüman içermeyen bir işlev isminden yararlanır. Bununla birlikte, "kendisine bakan" bir program genellikle doğru bir sorgu olarak kabul edilmez. “Gerçek” bir sorgu yazıp yazmadığımı kararlaştırmaya çalışırken anlayamadığımı fark ettiğim iki şey var: (1) Bir programın “kendi başına” (bir kuine bakış açısından) kullanımının ötesinde ne oluşturduğu nedir? dosya i/o ve (2) function(){}'un (veya logical(0) gibi benzer komutların) kendilerini yazdırdıklarında kendiliğinden referans olma derecesidir. Birincisi SO için çok sübjektif gibi görünüyor, ama ikincisine biraz açıklık getirmeyi umuyordum. Yani ...

function(){}'u çalıştırdığımda, kendi "kaynak kodunu" yazdırmasına neden olan tam olarak ne oluyor? Örneğin, R boş bir işlevi yerel ortama yüklüyor, bu işlevi değerlendiriyor ve sonra yazdırmak için tanımlanmış olan koda bakıyor mu? Ya da sadece function(){}'a bakıp tanımını hemen yansıtıyor mu? ikisi de zaman koşmak kendilerini baskı nasıl açısından bu ve

f<-function(){cat("f<-");print(f);cat("f()")} 
f() 

arasında temel bir fark var mı?

+5

için:

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

Gerçek R quine böyle bir şey olurdu REPL sizin için 'print()' kelimesini dolaylı olarak çağırıyor; kaynak kodunuz kendini yazdırmıyor. – MrFlick

+1

"Quine" kelimesini hiç duymadım, fakat R fonksiyonları eğlenceli, belki de f gibi bir şey - (function() this <- function() print (attr (this, 'srcref')))() ' sonra 'f()' – jenesaisquoi

+1

Herhangi bir anonim işlev tanımı, mantığınızı izleyen bir sorgudır. Aslında, tanımladığınız işlev yürütülmez, ancak sadece basılı olarak, @MrFlick'in dediği gibi. – nicola

cevap

0

Bu, stdout'a hiçbir şey yazdırmaması nedeniyle gerçek bir sorgu değildir. Quine'ın bütün noktası, baskı yaparak kendini yeniden üretebilmesidir. Program, tam kodunu içeren stdout'ta yeni bir dosya veya çıktı oluşturmalıdır. bir javascript Quine'ın

Örnek olacaktır:

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

Tamamen burada neler olduğunu anlamıyorum. Aslında, kod

function(){} 

arayla argümanları ve beden olmadan bir işlev inşa iade ve geri verdikten sonra hemen silmesini şey yapmaz. Çıktısı NULL olur, bu yüzden "kendini yeniden yaratmaz".

Konsolda gördüğünüz çıktı, function(){} tarafından verilen çıktı değil, print.function. Konsolda bir işlev nesnesinin gösterilmesiyle ilgilenen S3 yöntemi budur. Ne aslında yapmak geçerli:

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

Ayrıca bkz Wikipedia bu ve diğer örnekler

Ben çünkü hile yapmak olurdu düşünmek
İlgili konular