【问题标题】:Looking for Programming Language that allows you to change true and false寻找允许你改变真假的编程语言
【发布时间】:2010-03-17 17:36:01
【问题描述】:

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

类似这样的:

true = false, false = true;

这也会影响任何条件语句,因此42 == 42 应该返回 False。 基本上,在这个前提下,语言中的任何内容都不会对程序员安全。

有这样的语言吗?

【问题讨论】:

  • 作为这种假设语言的假设用户,我只需反转所有布尔条件即可。没有什么“不安全”的......
  • 这种语言的存在会吓到我。这样的功能只适用于凭空制造错误。
  • 这是一个书呆子寻宝游戏,不是吗?
  • 如果这种理论语言允许这样做,这意味着它可能允许其他有趣(并且更有用)的东西。书呆子寻宝游戏?嗯...
  • 呃,你的例子有缺陷吗?真=假;这个声明不会使下一个语句 false = false 吗?

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


【解决方案1】:

Smalltalk 会让你这样做。

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

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

【讨论】:

  • 我似乎记得这种语言,但我不知道它可以做到这一点。这似乎正是我一直在寻找的。谢谢!
【解决方案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?

【讨论】:

  • 但是如果你输入“print False”会发生什么? B-)
  • 在 Python 2.6 中工作。在 Python 3.1 中,我得到 SyntaxError: assignment to keyword
【解决方案3】:

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

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

或者,也许你的意思是你希望它产生后果。例如,如果您希望它不打印任何内容:

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

这样做的后果超出了我的想象,但是如果您要重新定义条件原语(if、switch 等),您可以做到。通过创建这些条件的新版本,这可能是最简单的 LISP。看起来 Bryan 在谈论 Tcl 时讨论过这个问题。


顺便说一句:假设您创建了一种语言,其中 false 为 true,true 为 false,if 为 if not,!=s 为 ==s,依此类推。也许如果你倒置了足够多的东西,你就会回到原来的语言。 :)

【讨论】:

  • 顺便说一句:完整的圆圈之类的东西?从数学上讲,两个负数确实是一个正数。嗯。
【解决方案4】:

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

【讨论】:

  • 我知道 c/c++ 允许您为此使用宏,我一直在寻找比宏更动态的东西。不过感谢您的回答!
  • 我不认为 C++ 允许您重新定义所有参数都是原始类型的运算符。
  • 你还必须为你使用的每一个类重载==,你不能对基类型这样做。 1 == 2 将是错误的,无论你在 C++ 中做什么。
  • 公平点,伙计们。出于某种原因,我从来没有需要找出答案!
【解决方案5】:

更改表示真假的文字/常量与更改布尔表达式的含义是有区别的。第一个很简单,可以使用任一程序源代码轻松完成,例如在 C 中:

#define TRUE 0
#define FALSE 1

或编译器源代码。

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

【讨论】:

    【解决方案6】:

    Tcl 可能会做你想做的事。也许。您不能完全重新定义 true 和 false,因为 tcl 实际上没有 true 或 false 对象或值这样的东西,但是您可以重新定义所有作用于表达式的命令以返回与正常情况相反的结果。例如,您可以重新定义“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+)

    【讨论】:

      【解决方案7】:

      万一我想要这个,我会重新定义 if,(或将 IF 设为宏,然后使用它......)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 2011-04-03
        • 1970-01-01
        • 2012-06-15
        相关资源
        最近更新 更多