寻找允许您改变真假的编程语言

时间:2010-03-17 17:36:02

标签: programming-languages metaprogramming language-design language-features

为了我的好奇心,我正在寻找一种动态的面向对象语言,它允许你将true改为false,反之亦然。

这样的事情:

true = false, false = true;

这也应该影响任何条件语句,因此42 == 42应该返回 False 。 基本上,在这个前提下,语言中没有任何东西对程序员来说是安全的。

有这样的语言吗?

7 个答案:

答案 0 :(得分:5)

Smalltalk会让你这样做。

  

Smalltalk-80中的所有内容都是   可从内部修改   正在运行的程序。这意味着,   例如,可以更改IDE   没有重启的正在运行的系统   它。在一些实施方式中,   语言的语法或垃圾   集合实现也可以   在飞行中改变了。甚至声明    true成为:false 有效   Smalltalk虽然正在执行它   不建议。使用时   明智地说,这种灵活性   允许最短的一个   新代码输入的必要时间   生产系统。

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

答案 1 :(得分:2)

Python(显然在版本3之前):

True = False
print True, False

>>False False

可是:

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

>>True True False

有关详情,请参阅:

  1. Why can’t Python handle true/false values as I expect?

  2. Has TRUE always had a non-zero value?

答案 2 :(得分:2)

您的问题有两种可能的答案。

一种可能性:你可能仍然使用真假,但你生活在异乡,你用不同的名字称呼它们。在这种情况下,它只是编译器/调试器环境显示的问题 - 通过修改编程工具可以改变。 (或者,你可以从LISP开始,which lacks a boolean primitive。)

,也许您所说的是您希望它产生后果。例如,如果您不希望打印任何内容:

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

这种后果超出了我的想象能力,但是如果你要重新定义条件基元(如果,切换等),你就可以做到。通过创建这些条件的新版本,在简单的LISP中可能是最简单的。看起来Bryan在谈论Tcl时讨论过。


除此之外:假设您创建的语言中false为true,true为false,ifs为nots,!= s = = s,依此类推。也许如果你把足够的东西翻过来,你就会回到原来的语言。 :)

答案 3 :(得分:1)

C / C ++允许你定义宏,所以TRUE == FALSE和FALSE == TRUE 您还可以将==运算符重载为等于!=(反之亦然)作为单独的步骤。

答案 4 :(得分:1)

更改表示true和false的文字/常量以及更改布尔表达式的含义之间存在差异。第一个很简单,可以使用程序源,例如在C:

中轻松完成
#define TRUE 0
#define FALSE 1

或编译器源。

但是改变布尔表达式在所有情况下的评估方式都不那么简单但不太难。但是,它将再次需要更改编译器或解释器源。

答案 5 :(得分:1)

Tcl可能会做你想要的。也许。您不能完全重新定义true和false,因为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 +)

答案 6 :(得分:0)

在不太可能的情况下,我想要这个,我只是重新定义if,(或使IF成为宏,然后使用它......)