В поисках языка программирования, который позволяет вам изменить истину и ложь - PullRequest
2 голосов
/ 17 марта 2010

Ради любопытства я ищу динамический объектно-ориентированный язык, который позволяет вам изменить истину на ложь и наоборот.

Примерно так:

true = false, false = true;

Это также должно влиять на любые условные выражения, поэтому 42 == 42 должно возвращать False . По сути, с этой предпосылкой ничто в языке не будет в безопасности от программиста.

Есть ли такой язык?

Ответы [ 7 ]

5 голосов
/ 17 марта 2010

Smalltalk позволит вам сделать это.

Все в Smalltalk-80 доступны для модификации изнутри запущенная программа. Это означает, что, например, IDE можно изменить в работающая система без перезапуска Это. В некоторых реализациях синтаксис языка или мусор реализация коллекции также может быть поменял на лету. Даже утверждение true становится: false действует в Smalltalk, хотя его выполнение не рекомендуется. Когда используется разумно, этот уровень гибкости позволяет для одного из самых коротких необходимое время для ввода нового кода производственная система.

http://en.wikipedia.org/wiki/Smalltalk

2 голосов
/ 17 марта 2010

Есть два возможных ответа на ваш вопрос.

Одна возможность: вы все еще можете использовать истину и ложь, но вы живете в чужой стране, где вы называете их разными именами. В этом случае, это просто вопрос того, что отображает среда компилятора / отладчика - это можно изменить, изменив инструменты программирования. (Или вы можете начать с LISP, , в котором отсутствует логический примитив .)

Или , возможно, вы говорите, что хотите, чтобы это имело последствия. Например, если вы хотите, чтобы это ничего не печаталось:

if (42==42) {
   print("This is true");
}

Последствия этого находятся за пределами моей способности представить, но если бы вы переопределили условные примитивы (если, переключение и т. Д.), Вы могли бы это сделать. Вероятно, было бы проще всего использовать LISP с пустыми руками, создав новые версии этих условий. Похоже, Брайан обсуждал это, когда говорил о Tcl.


В сторону: допустим, вы создаете язык, где false - это true, true - это false, если if - если нет,! = S - это == s и так далее. Возможно, если бы вы перевернули достаточно вещей, вы бы вернулись к исходному языку. :)

2 голосов
/ 17 марта 2010

Python (очевидно, до версии 3):

True = False
print True, False

>>False False

Но:

True = False
print 1==1, 1!=2, 2!=2

>>True True False

Подробнее см., Например:

  1. Почему Python не может обрабатывать значения true / false, как я ожидал?

  2. Всегда ли TRUE отличалось от нуля?

1 голос
/ 17 марта 2010

Tcl может делать то, что вы хотите. Может быть. Вы не можете точно переопределить истину и ложь, поскольку в tcl на самом деле нет такого понятия, как истинный или ложный объект или значение, но вы можете переопределить все команды, которые действуют в выражениях, чтобы вернуть противоположное тому, что обычно делает. Например, вы можете переопределить «if», чтобы вернуть противоположность базовому определению if.

Вот тривиальный неполный пример:

# keep the old if around
rename if ::_if

# make a new if with a negated condition
proc ::if {condition args} {
     set command [list _if !($condition) {*}$args]
     uplevel $command
}

В интерактивном режиме я получаю:

% if true {puts true} else {puts false}
false
% if 1==1 {puts true} else {puts false}
false

(требуется tcl 8,5 +)

1 голос
/ 17 марта 2010

Существует разница между изменением литералов / констант, которые представляют истину и ложь, и изменением значения логических выражений. Первое легко и может быть выполнено тривиально с любым источником программы, например в C:

#define TRUE 0
#define FALSE 1

или исходный код компилятора.

Но изменение того, как логические выражения оцениваются при любых обстоятельствах, было бы менее тривиальным, но не слишком сложным. Это снова потребует изменений в источнике компилятора или интерпретатора.

1 голос
/ 17 марта 2010

C / C ++ позволит вам определять макросы, поэтому TRUE == FALSE и FALSE == TRUE Вы также можете перегрузить оператор ==, чтобы он был эквивалентен! = (И наоборот) как отдельный шаг.

0 голосов
/ 17 марта 2010

В маловероятном случае, когда я этого хотел, я бы просто переопределил if (или сделал бы IF макросом, а затем использовал его ...)

...