以下查询中的评估顺序是什么:
UPDATE tbl SET q = q + 1, p = q;
Run Code Online (Sandbox Code Playgroud)
也就是说,将"tbl"."p"被设置为q或q + 1?此处的评估顺序是否受SQL标准的约束?
谢谢.
在考虑了Migs的回答之后,我对我能找到的所有数据库进行了一些测试.虽然我不知道标准是什么,但实施方式各不相同.
特定
CREATE TABLE tbl (p INT NOT NULL, q INT NOT NULL);
INSERT INTO tbl VALUES (1, 5); -- p := 1, q := 5
UPDATE tbl SET q = q + 1, p = q;
Run Code Online (Sandbox Code Playgroud)
我发现的价值"p"和"q"分别为:
database p q
-----------------+---+---
Firebird 2.1.3 | 6 | 6 -- But see …Run Code Online (Sandbox Code Playgroud) 我有这样的枚举:
enum class States(value: Int) {
STATE_A(1),
STATE_B(2),
STATE_C(3),
STATE_D(4)
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得枚举的价值?例如States.STATE_C应返回3.
我知道你可以使用'(aka quote)创建一个列表,我一直都在使用它,如下所示:
> (car '(1 2 3))
1
Run Code Online (Sandbox Code Playgroud)
但它并不总是像我期望的那样工作.例如,我试图创建一个函数列表,像这样,但它不起作用:
> (define math-fns '(+ - * /))
> (map (lambda (fn) (fn 1)) math-fns)
application: not a procedure;
expected a procedure that can be applied to arguments
given: '+
Run Code Online (Sandbox Code Playgroud)
当我使用时list,它的工作原理:
> (define math-fns (list + - * /))
> (map (lambda (fn) (fn 1)) math-fns)
'(1 -1 1 1)
Run Code Online (Sandbox Code Playgroud)
为什么?我认为'这只是一个方便的速记,为什么行为不同?
我想知道为什么评估函数在gdb中不起作用?在我的源文件中包含,当在gdb中调试时,这些示例是错误的评估.
(gdb) p pow(3,2)
$10 = 1
(gdb) p pow(3,3)
$11 = 1
(gdb) p sqrt(9)
$12 = 0
Run Code Online (Sandbox Code Playgroud) 未装箱的类型,比如Int#,和严格的功能,f (!x) = ...是不同的,但我看到概念上的相似性 - 他们在某种程度上不允许暴力/懒惰.如果Haskell是像Ocaml这样的严格语言,那么每个函数都是严格的,并且每个类型都是未装箱的.unboxed类型与强制执行之间的关系是什么?
在Haskell中,我可能会这样实现if:
if' True x y = x
if' False x y = y
spin 0 = ()
spin n = spin (n - 1)
Run Code Online (Sandbox Code Playgroud)
这表现我的期望:
haskell> if' True (spin 1000000) () -- takes a moment
haskell> if' False (spin 1000000) () -- immediate
Run Code Online (Sandbox Code Playgroud)
在Racket中,我可以实现这样的缺陷if:
(define (if2 cond x y) (if cond x y))
(define (spin n) (if (= n 0) (void) (spin (- n 1))))
Run Code Online (Sandbox Code Playgroud)
这表现我的期望:
racket> (if2 …Run Code Online (Sandbox Code Playgroud) evaluation haskell lazy-evaluation expression-evaluation idris
显然,C# 可以处理嵌套表达式和链式表达式。如果嵌套和/或链接是线性的,那么很明显表达式的计算顺序是:
Foo(Bar(Baz().Bop()))只能按以下顺序评估:
Baz()Bop()Bar()Foo()但如果嵌套不是线性的怎么办?考虑:Foo(Baz()).Bar(Bop())
显然以下内容必须全部为真:
Baz前FooFoo前BarBop前Bar但目前尚不清楚具体何时Bop进行评估。以下任何一项都是可行的订单:
Bop()Baz()Foo()Bar()Baz()Bop()Foo()Bar()Baz()Foo()Bop()Bar()我的直觉是第三个选项可能是正确的。即它会Foo(Baz())在开始评估任何一个之前进行全面评估.Bar(Bop())
虽然我当然可以测试个别情况来看看会发生什么,但这并不能告诉我我的猜测是否总是会发生的?
但我的问题是: 分支嵌套表达式的求值顺序是定义为 C# 语言规范的一部分,还是留给编译器根据情况判断?
如果不是,至少知道它是确定性的吗?
evaluation ×10
haskell ×2
bash ×1
c# ×1
c++ ×1
clojure ×1
enums ×1
eval ×1
expression ×1
function ×1
gdb ×1
idris ×1
if-statement ×1
kotlin ×1
math ×1
quote ×1
racket ×1
scheme ×1
sh ×1
sql ×1
sql-update ×1
strictness ×1