前几天,我遇到了这个结构:
static_cast<size_type>(-1)
Run Code Online (Sandbox Code Playgroud)
在一些示例C++代码中,可能(取决于where的详细信息size_type)等同于以下C:
(size_t)(-1)
Run Code Online (Sandbox Code Playgroud)
据我所知,它的工作原理是二进制补码算术中-1的表示形式,11111...1就像你所拥有的那样多,所以这是获得无符号类型size_t可以容纳的最大值的快速方法.但是,我的理解是C不保证将使用二进制补码; 如果C实现使用一个补码,这将比最大值小1,如果它使用有符号幅度,它将只是最大值的一半.
是否有一些我不知道的皱纹确保无论使用的有符号整数的表示如何都能正常工作?C和C++之间有什么不同(许多令人惊讶的事情都有)?
Mathematica的内置格式列表相当广泛; 但是,JSON不在该列表中.是否存在用于在Mathematica中生成和解析JSON的现有解决方案,或者我们是否必须推出自己的解决方案?
我正在试图弄清楚如何使用我开始的一个程序的输出流,RUN-PROGRAM因此它可以用作另一个程序的输入RUN-PROGRAM(即道德,也许是文字等效的管道).我已经使用了一些组合的尝试:INPUT,:OUTPUT和:WAIT关键字参数,但没有我打后一直生产至今.任何提示都会有所帮助; 例如,我将如何ls | grep lisp从shell中做一些事情?
我的一个尝试是
(defun piping-test ()
(let ((grep-process (run-program "/usr/bin/grep" '("lisp")
:input :stream
:output :stream)))
(unwind-protect
(with-open-stream (s (process-input grep-process))
(let ((ls-process (run-program "/bin/ls" '()
:output s)))
(when ls-process
(unwind-protect
(with-open-stream (o (process-output grep-process))
(loop
:for line := (read-line o nil nil)
:while line
:collect line))
(process-close ls-process)))))
(when grep-process (process-close grep-process)))))
Run Code Online (Sandbox Code Playgroud)
在SLIME REPL中运行它会导致一切都挂起,直到我打破C-c C-c,所以它显然不是正确的事情,但我不知道如何改变它所以它是正确的.
编辑:添加:WAIT NIL到两个RUN-PROGRAM调用,或仅添加到调用grep …
许多算法(如用于按字典顺序查找列表的下一个排列的算法)涉及查找列表中最后一个元素的索引.但是,我还没有找到一种方法在Mathematica中做到这一点并不尴尬.最直接的方法使用LengthWhile,但它意味着反转整个列表,如果您知道所需的元素接近列表的末尾并颠倒谓词的意义,则可能效率低下:
findLastLengthWhile[list_, predicate_] :=
(Length@list - LengthWhile[Reverse@list, ! predicate@# &]) /. (0 -> $Failed)
Run Code Online (Sandbox Code Playgroud)
我们可以做一个明确的,强制性的循环Do,但结果也有点笨拙.如果Return实际上从函数而不是Do块返回它会有所帮助,但它没有,所以你不妨使用Break:
findLastDo[list_, pred_] :=
Module[{k, result = $Failed},
Do[
If[pred@list[[k]], result = k; Break[]],
{k, Length@list, 1, -1}];
result]
Run Code Online (Sandbox Code Playgroud)
最终,我决定使用尾递归进行迭代,这意味着提前终止更容易一些.使用#0允许匿名函数调用自身的奇怪但有用的符号,这变为:
findLastRecursive[list_, pred_] :=
With[{
step =
Which[
#1 == 0, $Failed,
pred@list[[#1]], #1,
True, #0[#1 - 1]] &},
step[Length@list]]
Run Code Online (Sandbox Code Playgroud)
但这一切看起来都太难了.有没有人看到更好的方法?
编辑添加:当然,我的首选解决方案有一个错误,这意味着它在长列表中被打破,因为$IterationLimit.
In[107]:= findLastRecursive[Range[10000], # > 10000 &]
$IterationLimit::itlim: Iteration limit of …Run Code Online (Sandbox Code Playgroud) 我刚刚开始研究Okasaki的Purely Functional Data Structures,但是我一直在用Haskell而不是Standard ML做事.但是,我遇到了一个早期练习(2.5),让我对如何在Haskell中做事情感到有点困惑:
将现有元素插入二叉搜索树会复制整个搜索路径,即使复制的节点与原始节点无法区分.使用异常重写插入以避免此复制.每次插入只建立一个处理程序,而不是每次迭代一个处理程序.
现在,我的理解是,作为一种不纯洁的语言,ML通过传统的异常处理方法得到了解,而不是Java,所以你可以完成这样的事情:
type Tree = E | T of Tree * int * Tree
exception ElementPresent
fun insert (x, t) =
let fun go E = T (E, x, E)
fun go T(l, y, r) =
if x < y then T(go (l), x, r)
else if y < x then T(l, x, go (r))
else raise ElementPresent
in go t
end
handle ElementPresent => t
Run Code Online (Sandbox Code Playgroud)
我没有ML实现,所以这在语法方面可能不太正确.
我的问题是,我不知道这是如何在Haskell做,在做的一切之外IO单子,这似乎是作弊,即使它不是作弊,将严重限制其真正的功能的用处并不做任何突变.我可以使用Maybe …
单元测试涉及失败的代码路径的最佳方法是什么malloc()?在大多数情况下,它可能并不重要,因为你正在做类似的事情
thingy *my_thingy = malloc(sizeof(thingy));
if (my_thingy == NULL) {
fprintf(stderr, "We're so screwed!\n");
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
但在某些情况下,除了死亡之外你还有其他选择,因为你已经为缓存或其他任何东西分配了一些额外的东西,你可以收回那些记忆.
但是,在那些您可以尝试从失败malloc()中恢复的情况下,您在代码路径中执行的操作非常棘手并且容易出错,这使得测试变得尤为重要.你是怎么做到这一点的?
是否有一些直接的方法可以确保在转换为字符串时,近似数字(即Real带头部的数字)不会有尾随"."?如果他们在实际显示小数部分的情况下只有小数点,我想要它.
我发现的解决方案并不健全,并且以笨拙的方式依赖于使用Precision和Accuracy共同NumberForm使用,或者以RealDigits更加笨拙的方式使用.
提前致谢.
我有一个case类,它的构造函数有一些参数,我定义了一个附带的类对象,它定义了一个带有不同参数集的替代构造函数,如下所示:
case class MyClass (c: Char, mc: List[MyClass])
object MyClass {
def apply(c: Char, mc: MyClass): MyClass = {
MyClass(c, List(mc))
}
}
Run Code Online (Sandbox Code Playgroud)
我想在一个:中使用原始的 case类构造函数foldRight:
object SomeStuff {
def problem (s: String) {
assert(!s.isEmpty)
val zero = MyClass('a', Nil)
val mc2 = "Pillsy Pillsy Pillsy" foldRight(zero) {
MyClass(_, List(_))
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我从编译器收到一条错误消息:"MyClass不接受参数." 如果我注释掉这一部分,val mc2 = ...这个问题就会消失,但MyClass显然是在定义参数中zero.我觉得我必须遗漏一些非常基本的东西,但我不知道它是什么.我已经尝试了几个解决方法,比如定义辅助方法或函数值作为第二个参数foldRight,但没有一个有用,这并不太令人惊讶,因为我基本上随意地摸索.
我已经完成了Graham Common Lisp第5章练习5,它需要一个带有对象X和向量V的函数,并返回紧接在V中的X之前的所有对象的列表.
它的作用如下:
> (preceders #\a "abracadabra")
(#\c #\d #r)
Run Code Online (Sandbox Code Playgroud)
我做了递归版:
(defun preceders (obj vec &optional (result nil) &key (startt 0))
(let ((l (length vec)))
(cond ((null (position obj vec :start startt :end l)) result)
((= (position obj vec :start startt :end l) 0)
(preceders obj vec result
:startt (1+ (position obj vec :start startt :end l))))
((> (position obj vec :start startt :end l) 0)
(cons (elt vec (1- (position obj vec :start startt :end l)))
(preceders obj …Run Code Online (Sandbox Code Playgroud) 假设我有这个奇妙的功能foo
[92]> (defun foo () (lambda() 42))
FOO
[93]> (foo)
#<FUNCTION :LAMBDA NIL 42>
[94]>
Run Code Online (Sandbox Code Playgroud)
现在,假设我想实际使用 foo并返回42.
我怎么做?我一直在谷歌周围徘徊,我似乎无法提出正确的语法.
common-lisp ×3
lisp ×3
c ×2
binary-tree ×1
c++ ×1
case-class ×1
haskell ×1
json ×1
lambda ×1
libc ×1
sbcl ×1
scala ×1
unit-testing ×1