我想为内置类型(例如Double)添加一个方法,以便我可以使用infix运算符.那可能吗?
我最近开始学习Clojure.通常它看起来很有趣,但我不能习惯一些语法上的不便(与之前的Ruby/C#体验相比).
嵌套表达式的前缀表示法.在Ruby中,我习惯于编写复杂的表达式,并将它们从左到右连接起来:some_object.map { some_expression }.select { another_expression }.当您逐步从输入值移动到结果时,它非常方便,您可以专注于单个转换,而无需在键入时移动光标.与在Clojure中编写嵌套表达式时的情况相反,我将内部表达式的代码编写到外部,我必须不断地移动光标.它会减慢并分散注意力.我知道->和->>宏,但我注意到它不是惯用语.当你开始在Clojure/Haskell等编码时,你有同样的问题吗?你是怎么解决的?
我的讲师给了我一个创建程序来转换和使用Stacks将表达式转换为postfix的任务.我已经制作了堆栈类和一些函数来读取中缀表达式.
但是这个函数被称为convertToPostfix(char * const inFix, char * const postFix)负责将数组inFix中的inFix表达式转换为使用堆栈的postFix数组中的post fix表达式,并没有做它想做的事情.你能帮助我,告诉我我做错了什么吗?
以下是从inFix转换为postFix的函数的代码,convertToPostfix(char * const inFix, char * const postFix)是我需要帮助修复的代码:
void ArithmeticExpression::inputAndConvertToPostfix()
{
char inputChar; //declaring inputChar
int i = 0; //inizalize i to 0
cout << "Enter the Arithmetic Expression(No Spaces): ";
while( ( inputChar = static_cast<char>( cin.get() ) ) != '\n' )
{
if (i >= MAXSIZE) break; //exits program if i is greater than or equal to 100
if(isdigit(inputChar) || isOperator(inputChar))
{
inFix[i] = inputChar; …Run Code Online (Sandbox Code Playgroud) 此代码按预期工作:
\nsub infix:<mean>(*@a) {\n @a.sum / @a.elems\n}\nsub Mean (*@a) {\n @a.sum / @a.elems\n}\n\nsay EVAL 'Mean 2, 6, 4'; # Output: 4\nsay EVAL '2 mean 6 mean 4'; # Output: 4\nRun Code Online (Sandbox Code Playgroud)\n当第 7 行在其自己的范围内时,它会按预期工作:
\n{say EVAL 'Mean 2, 6, 4';} # Output: 4\nRun Code Online (Sandbox Code Playgroud)\n但是当第 8 行在它自己的作用域内时:
\n{say EVAL '2 mean 6 mean 4';} \n\n===SORRY!=== Error while compiling .../EVAL_1\nTwo terms in a row\nat .../EVAL_1:1\n------> 2\xe2\x8f\x8f mean 6 mean 4\n expecting any of:\n infix\n infix stopper\n statement end\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试使Haskell数据类型有点像python字典,ruby散列或javascript对象,其中字符串链接到一个值,如下所示:
data Entry t = Entry String t
type Dictionary t = [Entry t]
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常.但是,我想要一个稍好的构造函数,所以我尝试像这样定义它:
data Entry t = String ~> t
Run Code Online (Sandbox Code Playgroud)
这失败了.我试过这个:
data Entry t = [Char] ~> t
Run Code Online (Sandbox Code Playgroud)
再一次,它失败了.我知道~在Haskell 中有特殊含义,GHCi仍然允许操作员~>,但我还是尝试了另一种方式:
data Entry t = [Char] & t
Run Code Online (Sandbox Code Playgroud)
而另一个由于解析错误导致的失败.我发现这令人困惑,因为出于某些莫名其妙的原因,这有效:
data Entry t = String :> t
Run Code Online (Sandbox Code Playgroud)
这是否意味着对于中缀类型构造函数中可能出现的字符存在某些规则,或者它是一种误解.我不是Haskell的新手,而且我知道使用第一个构造函数会更加惯用,但是这个让我感到困惑,而且它似乎是Haskell的一个重要组成部分,我缺少了.
我已经看到了这一点,但我无法绕过它.不知何故,似乎神奇地,一些中缀函数工作正常,但其他函数根本无法编译.例如:
正如你在这里看到的那样,我的then函数作为一个传统函数工作,但不是作为中缀函数,但我的函数*却有相反的问题.让我的then功能成为中缀的神奇之处是什么?
附带问题:为什么我的*功能不能作为传统功能工作?
纯文本阅读器和复制粘贴的代码:
public func * (let left:String, let right:Int) -> String {
if right <= 0 {
return ""
}
var result = left
for _ in 1..<right {
result += left
}
return result
}
*("Left", 6) // error: '*' is not a prefix unary operator
"Left" * 6 // "LeftLeftLeftLeftLeftLeft"
public func then (let left:String, let _ right:String) -> String {
return left + right
}
then("Left", …Run Code Online (Sandbox Code Playgroud) val m = scala.collection.mutable.Map[String, Int]()
// this doesn't work
m += ("foo", 2)
// this does work
m += (("foo", 2))
// this works too
val barpair = ("bar", 3)
m += barpair
Run Code Online (Sandbox Code Playgroud)
那么m += ("foo" , 2)没有工作的协议是什么?Scala给出了类型错误:
error: type mismatch;
found : java.lang.String("foo")
required: (String, Int)
m += ("foo", 2)
^
Run Code Online (Sandbox Code Playgroud)
显然Scala认为我试图+=用两个参数调用,而不是一个元组参数.为什么?这不是明确的,因为我没有使用m.+=?
我希望用户能够像这样输入:
5+6*t+sin(2*t)
Run Code Online (Sandbox Code Playgroud)
,所以它将转换为:
(+ 5 (* 6 t) (sin (* 2 t)))
Run Code Online (Sandbox Code Playgroud)
,所以我可以将它评估为一些JIT的函数,以后再高效执行.
是否已有可用于最新Clojure的库(具有运营商优先级)?
编译器接受中缀+泛型方法,但使用它的语法是什么?例如,给出了两个相同的方法(模任意通用类型):
infix inline fun Int1.plus1(i: Int1) = Int1(this.value + i.value)
infix inline fun <U> Int1.plus2(i: Int1) = Int1(this.value + i.value)
Run Code Online (Sandbox Code Playgroud)
我可以写:
Int1(3).plus1(Int1(4))
Int1(3) plus1 Int1(4)
Int1(3).plus2<Int>(Int1(4))
Run Code Online (Sandbox Code Playgroud)
但这个电话无效:
Int1(3) plus2<Int> Int1(4)
Run Code Online (Sandbox Code Playgroud)
有人能解释我为什么吗?