我想改变我的堆栈大小,以允许具有许多非尾递归函数的项目在更大的数据上运行.为此,我尝试设置OCAMLRUNPARAM="l=xxx"不同的xxx值(在0到10G范围内),但它没有任何效果.设置OCAMLRUNPARAM甚至是正确的方法吗?
如果它是相关的:我感兴趣的项目是使用OCamlMakefile,target构建的native-code.
这是一个最小的例子,只是创建一个没有尾递归的大型列表.要快速检查OCAMLRUNPARAM的设置是否有效,我编译了程序stacktest.ml:
let rec create l =
match l with
| 0 -> []
| _ -> "00"::(create (l-1))
let l = create (int_of_string (Sys.argv.(1)))
let _ = print_endline("List of size " ^ string_of_int (List.length l) ^ " created.")
Run Code Online (Sandbox Code Playgroud)
使用命令
ocamlbuild stacktest.native
Run Code Online (Sandbox Code Playgroud)
并通过以下bash脚本通过(或多或少)二进制搜索大致发现堆栈溢出发生在列表的哪个长度foo.sh:
#!/bin/bash
export OCAMLRUNPARAM="l=$1"
increment=1000000
length=1
while [[ $increment > 0 ]] ; do
while [[ $(./stacktest.native $length) ]]; do
length=$(($length+$increment))
done
length=$(($length-$increment))
increment=$(($increment/2))
length=$(($length+$increment))
done
length=$(($length-$increment))
echo "Largest …Run Code Online (Sandbox Code Playgroud) 有没有办法用CSS选择元素的叔叔?具体来说,我正在为具有以下形式条目的页面编写一个 GreaseMonkey 脚本:
\n\n<ruby>\n <span class="under">\n <span class="wk_K">\xe6\xb1\xba</span>\n </span>\n <rt>\xe3\x81\x8d</rt>\n</ruby>\n<ruby>\n <span class="under">\xe6\xb1\xba</span>\n <rt>\xe3\x81\x8d</rt>\n</ruby>\nRun Code Online (Sandbox Code Playgroud)\n\n我想隐藏rt出现在字段旁边的每个字段wk_K(除非我将鼠标悬停在后者上),即上面rt示例中的第一个字段应该隐藏,但第二个字段不应该隐藏。
有时<span class="under">不存在,然后相邻的同级选择器就可以正常工作:
ruby .wk_K + rt {visibility:hidden;}\nruby .wk_K:hover + rt {visibility:visible;}\nRun Code Online (Sandbox Code Playgroud)\n\nwk_K当字段嵌套在 a 中时<span class="under">,即如果我想选择“相邻叔叔”,如何才能达到相同的效果?
我有时会编写函数来假设某些参数不会发生.如果他们这样做,这是一个错误,我失败了:
let foo = function
| 0 -> ()
| _ -> failwith "foo: bad argument"
Run Code Online (Sandbox Code Playgroud)
如果我稍后重命名该函数,我必须记住也要更改字符串.有没有办法以更系统的方式做到这一点?我的思绪徘徊在像
| _ -> failwith (FUNCTION_NAME ^ ": bad argument")
Run Code Online (Sandbox Code Playgroud)
where FUNCTION_NAME是编译器或解释器将实例化的字符串变量.但我不知道这样的事情是否适用于OCaml.如果没有,是否有最佳做法?