给FP版带点好玩的东西,FP语言的Quine
问:何为Quine ?
答:A program that generates a copy of its own source text as its complete output
下面的网站上还有很多其他语言的例子。
http://www.nyx.net/~gthompso/quine.htm
- Language: Haskell
- Author: Jon Fairbairn ([email]Jon.Fairbairn@cl.cam.ac.uk[/email])
- main = putStr (quine q)
- quine s = s ++ show s
- q = "main = putStr (quine q)nquine s = s ++ show snq = "
- Author: Andrew Mitchell
- --Hi there all, this is a quine for hugs by Andrew Mitchell
- --just run with the command quines
- a1 z zz = [zz] ++ e ++ init (init (concat [x:c|x <- z]))
- a2 = unlines ([((f!!z):[]) ++ e ++ t ++ (m!!z) ++ t | z <- [0..15]] ++ [[yf!!(2*z)]++[yf!!(2*z+1)] ++ e ++ t ++ (ym!!z) ++ t | z <- [0..11]])
- b = "a1 z zz = [zz] ++ e ++ init (init (concat [x:c|x <- z]))"
- c = "++"
- d = "quine"
- e = " = "
- f = "bcdefghijklnopwx"
- g = "a2 = unlines ([((f!!z):[]) ++ e ++ t ++ (m!!z) ++ t | z <- [0..15]] ++ [[yf!!(2*z)]++[yf!!(2*z+1)] ++ e ++ t ++ (ym!!z) ++ t | z <- [0..11]])"
- h = "t"
- i = "u"
- j = "v"
- k = "n"
- l = "h++e++t++v++t++t"
- n = "i++e++t++v++k++t"
- o = "j++e++t++v++v++t"
- p = "quines = putStr (unlines ([yj] ++ [yk] ++ [b] ++ [g] ++ [a2] ++ [q] ++ [r] ++ [s] ++ [a1 ya (head yd)] ++ [a1 yb (head ye)] ++ [a1 yc (head yg)] ++ [yh] ++ [yi] ++ [p]))"
- w = "["
- x = "]"
- ya = "hetvtt"
- yb = "ietvkt"
- yc = "jetvvt"
- yd = "q"
- ye = "r"
- yf = "yaybycydyeyfygyhyiyjykyl"
- yg = "s"
- yh = "ym = [ya,yb,yc,yd,ye,yf,yg,yh,yi,yj,yk,yl]"
- yi = "m = [b,c,d,e,f,g,h,i,j,k,l,n,o,p,w,x]"
- yj = "--Hi there all, this is a quine for hugs by Andrew Mitchell"
- yk = "--just run with the command quines"
- yl = ""
- t = """
- u = "n"
- v = "\"
- q = h++e++t++v++t++t
- r = i++e++t++v++k++t
- s = j++e++t++v++v++t
- ym = [ya,yb,yc,yd,ye,yf,yg,yh,yi,yj,yk,yl]
- m = [b,c,d,e,f,g,h,i,j,k,l,n,o,p,w,x]
- quines = putStr (unlines ([yj] ++ [yk] ++ [b] ++ [g] ++ [a2] ++ [q] ++ [r] ++ [s] ++ [a1 ya (head yd)] ++ [a1 yb (head ye)] ++ [a1 yc (head yg)] ++ [yh] ++ [yi] ++ [p]))
复制代码
- Language: Emacs LISP
- Author: Douglass Auclair
- (let ((quine "(let ((quine %c%s%c)) (insert (format quine 34 quine 34)))"))
- (insert (format quine 34 quine 34)))
- Author: Sam Steingold
- (let ((a "(let ((a %c%s%c)) (format a 34 a 34))")) (format a 34 a 34))
复制代码
- Language: Scheme
- Author: Tanaka Tomoyuki([email]tanaka@ucdavis.edu[/email])
- Note: (Chez Scheme Version 5.0b)
- (call/cc
- (lambda (c)
- (c ((lambda (c) `(call/cc (lambda (c) (c (,c ',c)))))
- '(lambda (c) `(call/cc (lambda (c) (c (,c ',c)))))))))
- Author: Tanaka Tomoyuki([email]tanaka@ucdavis.edu[/email])
- Note: (Chez Scheme Version 5.0b)
- (call/cc
- (lambda (c)
- (call/cc
- (lambda (cc)
- (c ((lambda (c)
- `(call/cc
- (lambda (c) (call/cc (lambda (cc) (c (,c ',c)))))))
- '(lambda (c)
- `(call/cc
- (lambda (c) (call/cc (lambda (cc) (c (,c ',c)))))))))))))
- Author: Tanaka Tomoyuki([email]tanaka@ucdavis.edu[/email])
- Note: (Chez Scheme Version 5.0b)
- ((lambda (q qq) ((lambda (x) `((lambda (q qq) ,(q x)) . ,(q qq)))
- '(lambda (x) `((lambda (q qq) ,(q x)) . ,(q qq)))))
- (lambda (q) `(,q ',q))
- '(lambda (q) `(,q ',q)))
- Author: Tanaka Tomoyuki([email]tanaka@ucdavis.edu[/email])
- Note: (Chez Scheme Version 5.0b)
- ((lambda (c)
- (if (procedure? c) (c 0)
- ((lambda (c) `((lambda (c) (if (procedure? c) (c 0) (,c ',c)))
- (call/cc call/cc)))
- '(lambda (c) `((lambda (c) (if (procedure? c) (c 0) (,c ',c)))
- (call/cc call/cc))))))
- (call/cc call/cc))
- Author: Tanaka Tomoyuki([email]tanaka@ucdavis.edu[/email])
- Note: (Chez Scheme Version 5.0b)
- ((lambda (c)
- (if (procedure? c)
- (c '`((lambda (c) (if (procedure? c) (c ',c) ,c)) (call/cc call/cc)))
- `((lambda (c) (if (procedure? c) (c ',c) ,c)) (call/cc call/cc))))
- (call/cc call/cc))
- Author: Tanaka Tomoyuki
- ((lambda (x) `((lambda (x) ,x) ',x)) '`((lambda (x) ,x) ',x))
- Author: Tanaka Tomoyuki
- ((lambda (q) ((lambda (x) `((lambda (q) ,((eval q) x)) ',q))
- '(lambda (x) `((lambda (q) ,((eval q) x)) ',q))))
- '(lambda (x) `(,x ',x)))
- Author: Moshe Zadka ([email]moshez@math.huji.ac.il[/email])
- Note: guile (A GNU implementation of Scheme)
- #!/usr/bin/guile
- -e main -s
- !#
- (define (main args)
- (display program)
- (write program)
- (display #))
- (newline))
- (define program
- "#!/usr/bin/guile \
- -e main -s
- !#
- (define (main args)
- (display program)
- (write program)
- (display #\))
- (newline))
- (define program
- ")
- Author: Moshe Zadka ([email]moshez@math.huji.ac.il[/email])
- ((lambda (p) (write (list p (list (quote quote) p))))
- (quote (lambda (p) (write (list p (list (quote quote) p))))))
- Author: Tanaka Tomoyuki
- Note: Palindromic in nature (look carefully I missied it at first)
- ((lambda (x) `(,(reverse x) ',x)) '(`(,(reverse x) ',x) (x) lambda))
复制代码
- Language: LISP (or Scheme)
- Author: Unknown
- Notes: There are several silly examples like this.
- T
- Author: Steven M. Haflich
- Note common LISP only
- #1=(WRITE '#1# :CIRCLE T)
- Author: Peter Norvig
- #1=(setq *print-circle* '#1#)
- Author: Unknown
- Note: only works if print-circle is defined
- #1='#1#
- Author: Peter Norvig
- Note: common LISP, self evaluating
- #1=((lambda () (setq *print-circle* '#1#)))
- Author: Chris Hruska
- ((LAMBDA (X) (LIST X (LIST 'QUOTE X))) '(LAMBDA (X) (LIST X (LIST 'QU
- OTE X))))
- Author: Dave Seaman ([email]ags@seaman.cc.purdue.edu[/email])
- (let ((p "(let ((p ~s)) (format t p p))")) (format t p p))
- Author: Sam Steingold
- (let ((a '(list 'let (list (list 'a (list 'quote a))) a)))
- (list 'let (list (list 'a (list 'quote a))) a))
- Author: Sam Steingold
- (let ((a '(list 'let (list (list 'a (list 'quote a))) a)))
- `(let ((a (quote ,a))) ,a))
- Author: Unknown
- ((lambda (x) (list x x)) (lambda (x) (list x x)))
- Author: Joe Miller
- Notes: In Common Lisp this should actually evaluate to the above list. In some dialects, however, it evaluates to itself.
- ((LAMBDA (X) `(,X ',X)) '(LAMBDA (X) `(,X ',X)))
- Author: Peter Norvig
- ((lambda (x) (list `',x)) '(lambda (x) (list x `',x)))
- Author: Unknown
- Note: common LISP
- ((lambda (list) (list list `',list))
- '(lambda (list) (list list `',list)))
- Author: John McCarthy(creator of the language) and Carolyn Talcott
- ((lambda (x)
- (list x (list (quote quote) x)))
- (quote
- (lambda (x)
- (list x (list (quote quote) x)))))
- Author: John Burger, David Brill, Filip Machi
- (PRINTME (LAMBDA NIL (PROG (A B)
- (SETQ A (QUOTE (PRINTME (LAMBDA NIL (PROG (A B)
- (SETQA (QUOTE FOO))
- (SETQ B (COPY A))
- (RPLACA (CDADDR (CADDAR (CDDADR B)))A)
- (SETQ B (COPY A))
- (RPLACA (CDADDR (CADDAR (CDDADR B))) A)
- (RETURN B))))
- Author: Louise Hay
- Note: Result of her quine-generating program
- ((LAMBDA NIL
- ((LAMBDA (Y)
- (LIST
- (LIST
- (QUOTE LAMBDA)
- NIL
- (LIST
- Y
- (LIST
- (QUOTE QUOTE)
- Y)))))
- (QUOTE
- (LAMBDA (Y)
- (LIST
- (LIST
- (QUOTE LAMBDA)
- NIL
- (LIST
- Y
- (LIST
- (QUOTE QUOTE)
- Y)))))))))
- Author: Pekka P. Pirinen
- Notes: This is a self-printing expression in the format sublanguage.
- It works by using the ~:* directive to back up in the argument list
- and reuse the previous argument; this is how it manages to use the
- same string to format the new expression and print a copy of itself
- inside the new expression. Some CLs have a bug in the ~@?
- recursive format directive that prevents backing up beyond the
- control string argument, but the standard implies it ought to work.
- Tested in LispWorks 4.2 on Unix.
- (format t "~@?" "(format t "~~@?" ~:*~S)")
- Authors: Paul Bratley and Jean Millo
- define((
- (c (prog (a)
- (print (quote define))
- (print (list(list(list(quote c) (get(quote c) (quote expr))))))
- (print (quote c))
- (print (list a))
- (print (quote stop))
- (print (quote fin))))))
- c(nil)
- stop
- fin
- Author: [email]Olin.Shivers@cosmos.vlsi.cs.cmu.edu[/email]
- ((lambda (lambda) `(,lambda ',lambda)) '(lambda (lambda) `(,lambda ',lambda)))
复制代码
[ 本帖最后由 swordfish.cn 于 2008-12-15 20:26 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
搜索到的另一个相关的网页
http://pluskid.lifegoo.com/wiki/Quine.html
打印自身的程序
感觉Quine就像生命体一样,可以自我繁殖。
汗......那个网页上居然还有TeX的 Quine ........................
随便输入个a, TeX不敢输出b来.....
有意思
不错
Haskell 这个稍微改下,putStr 换为 putStrLn
以前用 c 写过一个。