编辑:请,请,请阅读前回答这个帖子的底部列出的两个要求.人们不断发布他们的新宝石和图书馆等等,这显然不符合要求.
有时我想非常便宜地将一些命令行选项破解成一个简单的脚本.一个有趣的方法,没有处理getopts或解析或类似的东西,是:
...
$quiet = ARGV.delete('-d')
$interactive = ARGV.delete('-i')
...
# Deal with ARGV as usual here, maybe using ARGF or whatever.
Run Code Online (Sandbox Code Playgroud)
它不是普通的Unix选项语法,因为它将接受选项非选项命令行参数,如" myprog -i foo bar -q
",但我可以忍受.(有些人,比如Subversion的开发人员,更喜欢这个.有时我也会这样做.)
只是存在或不存在的选项不能比上述更简单地实现.(一个赋值,一个函数调用,一个副作用.)是否有一种同样简单的方法来处理带参数的选项,例如" -f
filename "?
我之前没有说过的一点,因为直到Trollop的作者提到图书馆符合"一个[800行]文件"之前我才清楚,我的目的不仅仅是清洁语法,但对于具有以下特征的技术:
整个代码可以包含在脚本文件中(不会压倒实际的脚本本身,可能只有几十行),因此可以bin
使用标准的Ruby 1.8在任何系统上删除dir中的单个文件.[5-7]安装并使用它.如果你不能编写一个没有require语句的Ruby脚本,并且解析几个选项的代码在十几行左右,那么你就不能满足这个要求.
代码很小而且非常简单,人们可以记住足够的代码来直接输入代码来完成这一操作,而不是从其他地方剪切和粘贴.想想你在一个没有互联网访问权限的防火墙服务器的控制台上的情况,你想把一个快速的脚本拼凑起来供客户使用.我不了解你,但是(除了上面的要求失败之外)记住甚至45行的简化微型optparse也不是我要做的事情.
在这个网站上,他们说有10个LISP原语.原语是:atom, quote, eq, car, cdr, cons, cond, lambda, label, apply
.
http://hyperpolyglot.wikidot.com/lisp#ten-primitives
Stevey估计有七个(或五个):
它是LISP概念纯度的一部分:你只需要七个(或五个?)原语来构建整个机器. http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html
构建LISP机器的最小基元数是多少(即可以在LISP代码上运行eval/value函数的东西)?(他们是哪一个?)
(我明白你可以没有生活atom, label and apply
)
某些软件(例如NetBeans IDE)将Linux安装程序发布到.sh文件中.想知道他们如何将整个IDE打包成'shell脚本',我在编辑器中打开了文件.我看到一些纯文本shell脚本代码,然后是一些随机的乱码,我认为它是"二进制"或非纯文本.
我想知道他们如何混合普通的shell脚本,然后可能会调用'不可读'的东西,这将是二进制文件.
对此有何见解?
我有一个连续值,我想计算一个指数移动平均线.通常我只是使用标准公式:
其中S n是新的平均值,α是α,Y是样本,S n-1是先前的平均值.
不幸的是,由于各种问题,我没有一致的采样时间.我可能知道我最多可以采样,比如每毫秒一次,但由于我无法控制的因素,我可能无法一次采样几毫秒.然而,一个更常见的情况是我简单地提前或延迟采样:而不是在0,1和2毫秒采样.我在0,0.9和2.1毫秒采样.我确实预计,无论延迟如何,我的采样频率都会远远超过奈奎斯特极限,因此我不必担心混叠.
我认为我可以通过根据自上次样本以来的时间长度适当地改变alpha来以一种或多或少的合理方式处理这个问题.
我的推理部分原因是EMA在前一个数据点和当前数据点之间"线性插值".如果我们考虑以间隔t计算以下样本列表的EMA:[0,1,2,3,4].如果我们使用区间2t,我们应该得到相同的结果,其中输入变为[0,2,4],对吧?如果EMA假设在t 2时该值从t 0开始为2 ,则与[0,2,2,4,4]上计算的区间t计算相同,但它没有这样做.或者这有意义吗?
有人能告诉我如何适当地改变阿尔法吗?"请展示你的作品." 即,向我展示数学,证明你的方法确实做得对.
我是函数式编程的新手,现在学习Haskell.作为练习,我决定实现一维线性扩散方程的显式欧拉方法.虽然下面的代码工作正常,但我对它的性能并不满意.事实上,我关心的是内存消耗.我相信它与懒惰评估有关,但无法弄清楚如何减少其内存使用量.
算法的想法非常简单,用命令性的术语表达:它采用一个"数组",并且每个内部点都添加一个值,该值是作为点本身和其中的值的组合计算的.邻居.边界点是特殊情况.
所以,这是我的Euler1D.hs模块:
module Euler1D
( stepEuler
, makeu0
) where
-- impose zero flux condition
zeroflux :: (Floating a) => a -> [a] -> [a]
zeroflux mu (boundary:inner:xs) = [boundary+mu*2*(inner-boundary)]
-- one step of integration
stepEuler :: (Floating a) => a -> [a] -> [a]
stepEuler mu u@(x:xs) = (applyBC . (diffused mu)) u
where
diffused mu (left:x:[]) = [] -- ignore outer points
diffused mu (left:x:right:xs) = -- integrate inner points
(x+mu*(left+right-2*x)) : diffused mu (x:right:xs)
applyBC inner …
Run Code Online (Sandbox Code Playgroud) garbage-collection haskell functional-programming memory-management lazy-evaluation
我经常听说Haskell没有变量的说法; 特别是,这个答案声称它没有,它至少被投票了九次并被接受.
那么它是否有变量,为什么?
这个问题似乎也适用于ML,F#,OCaml,Erlang,Oz,Lava和所有SSA中间语言.
variables monads haskell immutability referential-transparency
Scheme为所有变量使用单个名称空间,无论它们是绑定到函数还是其他类型的值.Common Lisp将两者分开,这样标识符"hello"可以引用一个上下文中的函数,而另一个中引用一个字符串.
(注1:此问题需要上述示例;请随意编辑并添加一个,或通过电子邮件发送原作者,我会这样做.)
但是,在某些上下文中,例如将函数作为参数传递给其他函数,程序员必须通过使用明确区分他指定函数变量而不是非函数变量#'
,如:
(sort (list '(9 A) '(3 B) '(4 C)) #'< :key #'first)
我一直认为这有点像疣,但我最近遇到的一个论点是,这实际上是一个特征:
......重要的区别实际上在于形式的语法,而不在于对象的类型.在不了解所涉及的运行时值的情况下,很明显函数形式的第一个元素必须是函数.CL采用这一事实并使其成为语言的一部分,以及宏观和特殊形式,这些形式也可以(并且必须)静态地确定.所以我的问题是:当函数名称的主要用途出现在很少想要出现变量名的地方时,为什么你希望函数的名称和变量的名称在同一名称空间中?
考虑类名的情况:为什么名为FOO的类会阻止使用名为FOO的变量?我唯一一次通过名称FOO引用该类是在期望类名的上下文中.如果在极少数情况下我需要获取绑定到类名FOO的类对象,则有FIND-CLASS.
这个论点确实从经验中对我有所帮助; Haskell中有一个类似的字段名称,它也是用于访问字段的函数.这有点尴尬:
data Point = Point { x, y :: Double {- lots of other fields as well --} }
isOrigin p = (x p == 0) && (y p == 0)
Run Code Online (Sandbox Code Playgroud)
这是通过一些额外的语法解决的,NamedFieldPuns
扩展特别好:
isOrigin2 Point{x,y} = (x == 0) && (y == 0)
Run Code Online (Sandbox Code Playgroud)
那么,对于问题,超越一致性,Common Lisp vs. Scheme以及一般来说,所有值的单个命名空间与函数和非函数值的单独命名空间有哪些优点和缺点?
埃德斯·迪克斯特拉(Edsger Dijkstra)有时候会有点磨练(他称之为"卡尔弗里德里希高斯,数学家之王,但也有点懦弱")在他的文章"关于真正教授计算科学的残酷"(EWD1036)中说:
许多这些现象都以"软件工程"的名义捆绑在一起.由于经济学被称为"悲惨的科学",软件工程应该被称为"命中注定的纪律",注定因为它甚至无法实现其目标,因为它的目标是自相矛盾的.当然,软件工程本身就是另一个有价值的原因,但这就是洗眼:如果你仔细阅读它的文献并分析它的奉献者实际做了什么,你会发现软件工程已经接受了它的章程"如果不能你如何编程" ".
这是真的?
我最近在几个不同的地方看到过这样的评论:"我在学校学习了递归,但从那时起就没有使用它或感觉到需要它." (递归似乎是某一类程序员中"书本学习"的一个流行的例子.)
嗯,在Java和Ruby [1]等命令式语言中,我们通常使用迭代并避免递归,部分原因是存在堆栈溢出的风险,部分原因是因为这些语言中的大多数程序员都习惯使用.
现在我知道,严格地说,在这样的语言中没有"必要的"递归用法:无论事情多么复杂,都可以用迭代替换递归.在这里"必要",我说的是以下内容:
您是否可以想到这些语言中代码的任何特定示例,其中递归比迭代(为了清晰,效率或其他原因)更好,无论如何您使用递归,转换为迭代会是一个很大的损失?
在答案中已经多次提到了递归行走的树:如果它可用,那么它使用它的确切原因是什么使得递归比使用库定义的迭代器更好?
[1]:是的,我知道这些也是面向对象的语言.然而,这与这个问题没有直接关系.
我有一个程序将内存中的安全敏感信息(如私钥)保存在内存中,因为它在程序的生命周期内使用它们.此程序的生产版本将RLIMIT_CORE设置为0,以确保永远不会生成可能包含此敏感信息的核心转储.
但是,虽然在core(8)
联机帮助页中没有提到这一点,但Ubuntu维基上的apport文档声称,
请注意,即使ulimit设置为禁用核心文件(通过使用ulimit -c 0指定核心文件大小为零),apport仍将捕获崩溃.
我的流程中是否存在一种方式(即,不依赖于外部系统的配置),我可以确保永远不会生成我的流程的核心转储?
注意:我知道有很多方法(例如下面的评论中提到的方法),具有root或进程所有者权限的用户仍然可以访问敏感数据.我的目标是通过将敏感数据保存到磁盘,发送到Ubuntu错误跟踪系统或类似的东西来防止无意中暴露敏感数据.(感谢Basile Starynkevitch明确表示这一点.)