如何制作古怪的数学计算器?(最好使用c+;+;但其他语言也可以。) 我想知道如何在C++中做一些下级的事情,这将允许我做一些“古怪”的数学运算。具体而言,我的两个问题是:
1) 如何定义编译器能够在代码中识别的数学符号。换句话说,我不想解析来自用户的字符串,而是让编译器将其识别为一个新的数学操作如何制作古怪的数学计算器?(最好使用c+;+;但其他语言也可以。) 我想知道如何在C++中做一些下级的事情,这将允许我做一些“古怪”的数学运算。具体而言,我的两个问题是:,c++,math,random,calculator,C++,Math,Random,Calculator,1) 如何定义编译器能够在代码中识别的数学符号。换句话说,我不想解析来自用户的字符串,而是让编译器将其识别为一个新的数学操作 ex: 3 {+} 4 will actually do 3 – 4 etc. 2) 如何从ASCII符号定义自定义数字。例如,将编译器要识别的符号#定义为18(即二进制的00010010) 如果可能的话,我希望能够在编译器级别完成以上两件事情。C++、爪哇、C、Python和ObjuleC中的解决方案都很好。请告诉我您的解决方案使用的语言。谢谢!:)
ex: 3 {+} 4 will actually do 3 – 4 etc.
2) 如何从ASCII符号定义自定义数字。例如,将编译器要识别的符号#定义为18(即二进制的00010010)
如果可能的话,我希望能够在编译器级别完成以上两件事情。C++、爪哇、C、Python和ObjuleC中的解决方案都很好。请告诉我您的解决方案使用的语言。谢谢!:) 您可以将类型包装到一个类中,然后重载运算符。我提出了一个“古怪”添加的最小示例(
+
变成-
)。但是如果你想使用pod,你必须使用预处理器,没有其他方法
#include <iostream>
using namespace std;
template<typename T>
class wacky
{
T val_;
public:
wacky(T val = {}): val_(val){};
// let's define a conversion operator
template<typename S>
operator S (){return val_;}
// we don't need asignment operator and copy ctors
// stream operators
friend ostream& operator<<(ostream& os, const wacky& rhs)
{
return os << rhs.val_;
}
// the += operator
wacky& operator+=(const wacky& rhs)
{
val_ -= rhs.val_; // wacky!
return *this;
}
// and the wacky operator+
friend wacky operator+(wacky lhs, const wacky& rhs)
{
return lhs+=rhs;
}
};
int main()
{
wacky<int> a,b;
a = 10;
b = 15;
// a and b behave now like PODs
// implicit conversions work etc
double wacky_sum = a + b;
cout << wacky_sum << endl; // -5
}
#包括
使用名称空间std;
模板
类怪人
{
T瓦卢;
公众:
古怪的(T val={}):val(val{};
//让我们定义一个转换运算符
模板
运算符S(){return val_;}
//我们不需要指定运算符和复制运算符
//流操作符
朋友OsFrand和操作员< P>我在评论中说,这意味着C++中的宏;如果你想要的不是比你所显示的复杂得多,它就应该做这个把戏。将操作符定义为宏应该适用于简单的查找/替换的情况,但是它可能不适合复杂的表达式和某些符号。
在我的脑海中,我认为通过使用中缀函数作为运算符在Haskell中是可行的,但对于初学者来说,这可能并不简单。请查看并搜索infixr
。不过,您需要了解Haskell的基本知识
使用Zeta示例进行编辑,您可以在ghci
中运行它:
(<+>) = (-) -- operator definition
(<*>) = (/)
answer = 42
answer <+> 12 -- prints 30
answer <*> 7 -- prints 6.0
()=(-)--运算符定义
() = (/)
答案=42
答案12——打印30
答案7——打印6.0
当然有一件事是肯定的,这是用C++来实现的,没有丑陋的宏。丑陋的宏可能只是这里的东西:虽然有点不太好,但这并不能取代真正的操作符定义。当然,你可以编写自己的编译器。你甚至不需要编写编译器;你只需要添加一个读取文件和R的进程。在构建之前,将{+}
替换为-
。但是,我认为OP的目的是让{+}
成为与+
不同的操作,在没有真正宏的语言中这是不可能的。除非使用{+}总是安全的
直接替换为-
@aruistante是的,您不能在没有preprocessor@vsoftco:谢谢!这看起来是个很好的建议。:)不过如果我能让{+}工作就太糟糕了。我会+1你的帖子,但我没有足够的声誉:(顺便说一句,我现在有足够的代表,所以我需要你。谢谢你的代码,这很好!@Vladimir很高兴这有帮助!谢谢!我会调查一下,但就像你说的,我需要知道Haskell hahaha;)不幸的是,{}
是特殊符号,不能用于自己的操作符。但是你可以很容易地创建其他操作符,比如
@Vladimir:=()事实上,只要这个问题被标记为C++,Haskell的回答就相当离题了。Haskell也是一个纯粹的函数式编程语言。这与C++、C、java、Python或ObjaveC C相比是另一种野兽。它会困扰着你。它会扭曲你的大脑。根据你想做的,它会改变你的大脑。“这完全是过火了。@Vladimir这是在编译器级别完成的,Haskell编译器非常聪明,所以我认为这是严格等价的。
(<+>) = (-) -- operator definition
(<*>) = (/)
answer = 42
answer <+> 12 -- prints 30
answer <*> 7 -- prints 6.0