Reading time:

How to write a program that can replicate itself

Grotsky is a toy programming language that I made for fun. Today we're visinting the concept of Quines, a.k.a. self replicating programs. It's said that any turing-complete language should be able to write a program that replicates itself. And grotsky is no exception.

Read more about grotsky in previous blogposts:

Quines are very easy to write. The language that you're using needs to be able to do a couple things:

  • Write to a file or stdout (print)
  • Support for string arrays
  • Translate numbers/integers to character ascii representation
  • Concatenate strings
  • Loop through arrays from arbitrary indexes

Super simple quine: less than 30 lines of code

let tabChar = 9
let quoteChar = 34
let commaChar = 44
let code = [
	"let tabChar = 9",
	"let quoteChar = 34",
	"let commaChar = 44",
	"let code = [",
	"]",
	"for let i = 0; i < 4; i = i+1 {",
	"	io.println(code[i])",
	"}",
	"for let i = 0; i < code.length; i = i+1 {",
	"	io.println(strings.chr(tabChar) + strings.chr(quoteChar) + code[i] + strings.chr(quoteChar) + strings.chr(commaChar))",
	"}",
	"for let i = 4; i < code.length; i = i+1 {",
	"	io.println(code[i])",
	"}",
]
for let i = 0; i < 4; i = i+1 {
	io.println(code[i])
}
for let i = 0; i < code.length; i = i+1 {
	io.println(strings.chr(tabChar) + strings.chr(quoteChar) + code[i] + strings.chr(quoteChar) + strings.chr(commaChar))
}
for let i = 4; i < code.length; i = i+1 {
	io.println(code[i])
}

Now we can use grotksy cli to run the program and compare the output to the original source.

Save the original source to a file called quine.gr then run the following commands:

$ grotsky quine.gr > quine_copy.gr
$ cmp quine.gr quine_copy.gr
$ echo $?
0

If you see a 0 as the final output that means the files are the same. Otherwise if you saw an error message or a different output, that means something has gone wrong.

How exciting is this?!! We've just written a program that gives itself as an output. That sounds impossible when you hear it for the first time. But it was actually pretty easy!

Source code available here: https://gist.github.com/mliezun/c750ba701608850bd86d646a3ebf700f.

Grotsky cli binary available here: https://github.com/mliezun/grotsky/releases/tag/v0.0.6