The unfathomable beauty of quines

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

The unfathomable beauty of quines

Joe Armstrong-2
I've been playing with the idea of a quine.

Here are three that are fun

Smalltalk
TiddlyWiki
Meta II

A quine is a self-reproducing program -  once the first version works it is used
to make the second version and so on ad infinitum. It's especially fun when it's
made as a single file.

WARNING - do not read the rest if you want to get any work done for
the next month.

Dan Ingalls (the guy who made Smalltalk) told me about Dewey Val Schorre's paper

http://www.ibm-1401.info/Meta-II-schorre.pdf

With strict instructions *not* to read it.

Well, of course, I immediately read it and implemented it in Erlang -
and poof - 3-6 weeks vanished in a blur (and don't get me started on
O'meta etc.)

Unfortunately, Erlang is not a quine - it actually was (or has been)
(or was for a short time)
but now it's very definitely not - all these BIFs and NIFS and dirty
this-and-that's
have destroyed any possibility for quine like behaviour.

Is there a subset of Erlang that can be made into a quine with a new
VM to support it?

Cheers

/Joe
_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|

Re: The unfathomable beauty of quines

Michael Truog
On 4/4/19 7:53 AM, Joe Armstrong wrote:

> I've been playing with the idea of a quine.
>
> Here are three that are fun
>
> Smalltalk
> TiddlyWiki
> Meta II
>
> A quine is a self-reproducing program -  once the first version works it is used
> to make the second version and so on ad infinitum. It's especially fun when it's
> made as a single file.
>
> WARNING - do not read the rest if you want to get any work done for
> the next month.
>
> Dan Ingalls (the guy who made Smalltalk) told me about Dewey Val Schorre's paper
>
> http://www.ibm-1401.info/Meta-II-schorre.pdf
>
> With strict instructions *not* to read it.
>
> Well, of course, I immediately read it and implemented it in Erlang -
> and poof - 3-6 weeks vanished in a blur (and don't get me started on
> O'meta etc.)
>
> Unfortunately, Erlang is not a quine - it actually was (or has been)
> (or was for a short time)
> but now it's very definitely not - all these BIFs and NIFS and dirty
> this-and-that's
> have destroyed any possibility for quine like behaviour.
>
> Is there a subset of Erlang that can be made into a quine with a new
> VM to support it?
>
> Cheers
>
> /Joe
> _______________________________________________
> erlang-questions mailing list
> [hidden email]
> http://erlang.org/mailman/listinfo/erlang-questions
>

Hi Joe,

I know you want to do more than a simple regex to mutate the quine, but
the simplest approach to a quine in Erlang should be in an escript.  An
example is below (I put it at
https://gist.github.com/okeuday/0fc551e2a5b1f346d64646d2cd2b66c7 , just
save it as "quine0"):

#!/usr/bin/env escript
%%!
%-*-Mode:erlang;coding:utf-8;tab-width:4;c-basic-offset:4;indent-tabs-mode:()-*-
% ex: set ft=erlang fenc=utf-8 sts=4 ts=4 sw=4 et:

-mode(compile).

main(["-i" | _]) ->
     MagicNumber = 0,
     GenerationName = filename:basename(escript:script_name()),
     "quine" ++ GenerationIndexStr = GenerationName,
     io:format("Hi, my name is \"~s\" (generation ~s)~n"
               "my magic number is ~w!~n",
[GenerationName,GenerationIndexStr,MagicNumber]),
     exit_code(0);
main([]) ->
     Path = filename:dirname(?FILE),
     "quine" ++ GenerationIndexStr = filename:basename(?FILE),
     NewGenerationIndex = erlang:list_to_integer(GenerationIndexStr) + 1,
     NewGenerationName = "quine" ++
erlang:integer_to_list(NewGenerationIndex),
     {ok, GenerationCurrent} = file:read_file(?FILE),
     S = erlang:integer_to_list(binary:decode_unsigned(
         crypto:strong_rand_bytes(2))),
     GenerationNew = re:replace(GenerationCurrent,
                                "MagicNumber = [0-9]+,",
                                "MagicNumber = " ++ S ++ ",",
                                [global, {return, binary}]),
     FilePath = filename:join(Path,NewGenerationName),
     ok = file:write_file(FilePath,GenerationNew),
     ok = file:change_mode(FilePath,8#00775),
     io:format("~s is born!~n", [NewGenerationName]),
     exit_code(0).

exit_code(ExitCode) ->
     erlang:halt(ExitCode, [{flush, true}]).
_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions