Языковые функции, полезные для написания цитат (самопечатающиеся программы)? - PullRequest
2 голосов
/ 20 июня 2010

ОК, для тех, кто никогда не сталкивался с этим термином, quine является «самовоспроизводящейся» компьютерной программой. Чтобы быть более конкретным, тот, который - при выполнении - создает копию своего собственного исходного кода в качестве единственного вывода.

Квины, конечно, могут быть разработаны на многих языках программирования (но не на всех); но некоторые языки, очевидно, больше подходят для создания квин, чем другие (чтобы ясно понять, что звучит несколько более субъективно "более подходящий", посмотрите на пример против Haskell и C на странице Wiki - и я предоставляю свой более объективное определение ниже).

Вопрос, который у меня возникает, с точки зрения языка программирования, какие возможности языка (теоретические или синтаксические) делают язык более подходящим / полезным для написания квин ?

Мое определение «более подходящее» - «легче писать» и «короче / читабельнее / менее запутано». Но вы можете добавить еще несколько критериев, которые хотя бы несколько объективны.

Обратите внимание, что этот вопрос явно исключает вырожденные случаи, подобно языку, который разработан, чтобы содержать примитив "print_a_quine".

Ответы [ 3 ]

3 голосов
/ 20 июня 2010

Я не совсем уверен, поэтому поправьте меня, если кто-то из вас знает лучше. Я согласен с обоими другими ответами, продолжая объяснять, что квинна это:

Г г

где Y является Y комбинатором с фиксированной точкой (или любым другим комбинатором с фиксированной точкой), что означает в лямбда-исчисление :

Y g = g (Y g)

Теперь совершенно очевидно, что нам нужно, чтобы код был данными, а g - функцией, которая будет печатать свои аргументы.

Итак, для подведения итогов нам нужно создать такие функции quines, функцию печати, комбинатор с фиксированной запятой и стратегию оценки по имени.

Наименьшим языком, удовлетворяющим этим условиям, является AFAIK Zot из семейства Iota и Jot .

3 голосов
/ 20 июня 2010

Такие языки, как Io Programming Language и другие, позволяют обрабатывать код как данные.В системах обхода дерева это обычно позволяет разработчику языка выставлять абстрактное синтаксическое дерево как гражданин первого класса.В случае с Ио это то, что он делает.Будучи объектно-ориентированным, AST моделируется вокруг объектов Message, и создается специальный страж для представления текущего выполняемого сообщения;этот страж называется thisMessage.thisMessage является полным сообщением, как и любое другое, и отвечает на сообщение print, которое выводит его на экран.В результате самая короткая квинна, которую я когда-либо смог произвести на любом языке, пришла от Ио и выглядит так:

thisMessage print

В любом случае, я просто не мог не поделиться этим с вамина эту тему.Вышеприведенное, безусловно, облегчает написание квин, но если вы не сделаете это таким образом, это не помешает легко создать квин.

2 голосов
/ 20 июня 2010

Я не уверен, что это полезный ответ с практической точки зрения, но в теории вычислимости есть некоторая полезная теория. В частности, фиксированные точки и теорема Клини о рекурсии могут быть использованы для написания квини. По-видимому, эту теорию можно использовать для написания лексики в LISP (как показано на странице википедии).

...