我正在写一个bash脚本.我需要当前的工作目录始终是脚本所在的目录.
默认行为是脚本中的当前工作目录是我运行它的shell的目录,但我不想要这种行为.
在python中移动列表的最有效方法是什么?现在我有这样的事情:
>>> def rotate(l, n):
... return l[n:] + l[:n]
...
>>> l = [1,2,3,4]
>>> rotate(l,1)
[2, 3, 4, 1]
>>> rotate(l,2)
[3, 4, 1, 2]
>>> rotate(l,0)
[1, 2, 3, 4]
>>> rotate(l,-1)
[4, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
我们正在开发一个程序,它接收和转发"消息",同时保留这些消息的临时历史记录,以便它可以告诉您消息历史记录(如果请求).消息以数字方式标识,通常大小约为1千字节,我们需要保留数十万条这些消息.
我们希望优化此程序的延迟:发送和接收消息之间的时间必须低于10毫秒.
该程序是用Haskell编写的,并用GHC编译.但是,我们发现垃圾收集暂停对于我们的延迟要求来说太长了:在我们的实际程序中超过100毫秒.
以下程序是我们的应用程序的简化版本.它使用a Data.Map.Strict
来存储消息.消息ByteString
由a标识Int
.以递增的数字顺序插入1,000,000条消息,并且不断删除最旧的消息以使历史记录最多保留200,000条消息.
module Main (main) where
import qualified Control.Exception as Exception
import qualified Control.Monad as Monad
import qualified Data.ByteString as ByteString
import qualified Data.Map.Strict as Map
data Msg = Msg !Int !ByteString.ByteString
type Chan = Map.Map Int ByteString.ByteString
message :: Int -> Msg
message n = Msg n (ByteString.replicate 1024 (fromIntegral n))
pushMsg :: Chan -> Msg -> IO Chan
pushMsg chan (Msg msgId msgContent) =
Exception.evaluate $
let
inserted = Map.insert …
Run Code Online (Sandbox Code Playgroud) 我知道的比任何其他语言都要多,每次我需要一些小东西时,我都会通过谷歌搜索"Bash".因此,我可以拼凑出似乎有用的小脚本.不过,我并不真正知道发生了什么事情,我希望的是更正式的介绍bash作为编程语言.例如:评估顺序是什么?范围规则是什么?什么是打字规则,例如一切都是字符串?程序的状态是什么 - 它是字符串到变量名的键值赋值; 还有更多,例如堆栈?有堆吗?等等.
我想咨询GNU Bash手册以获得这种洞察力,但它似乎并不是我想要的; 它更像是句法糖的清单,而不是核心语义模型的解释.在线的百万个"bash教程"只会更糟.也许我应该先学习sh
,并将Bash理解为一种语法糖?不过,我不知道这是否是一个准确的模型.
有什么建议?
编辑:我被要求提供一些理想我正在寻找的例子.我认为"形式语义"的一个相当极端的例子是本文关于"JavaScript的本质".也许一个稍微不那么正式的例子是Haskell 2010报告.
我正在阅读并发性.对于那些含有令人困惑的类似定义的术语,我有点过头了.即:
我的印象是,区别在于(1)是真正的并行还是多路复用; (2)是在CPU,OS还是在程序中管理; 和(3..5)我无法辨认的其他一些事情.
这些并行方法之间的差异是否有简明扼要的指导?
parallel-processing concurrency multithreading process fiber
普通的功能组成属于这种类型
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)
我认为这应该概括为类型:
(.) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
Run Code Online (Sandbox Code Playgroud)
一个具体的例子:计算差分平方.我们可以写diffsq a b = (a - b) ^ 2
,但感觉我应该能够编写(-)
和(^2)
编写类似的东西diffsq = (^2) . (-)
.
当然,我不能.我可以做的一件事是使用一个元组而不是两个参数(-)
,通过转换它uncurry
,但这不一样.
有可能做我想要的吗?如果没有,我误解的是什么让我认为它应该是可能的?
注意:这里已经有效地提出过这个问题,但是没有给出答案(我怀疑必须存在).
假设我们有以下Haskell:
data T = T0 | T1 | T2 | ... | TN
toInt :: T -> Int
toInt t = case t of
T0 -> 0
T1 -> 1
T2 -> 2
...
TN -> N
Run Code Online (Sandbox Code Playgroud)
在这里使用什么算法来执行模式匹配?我看到两个选择:
(1)线性搜索,类似于
if (t.tag == T0) { ... }
else if (t.tag == T1) { ... }
else ...
Run Code Online (Sandbox Code Playgroud)
(2)二进制搜索,在这个特定任务中是明智的:在t.tag
集合{ TO
... T1023
}中搜索.但是,在模式匹配通常具有许多其他功能和概括的情况下,可能不会使用此功能.
使用GHC进行编译,使用什么算法,对于模式匹配,使用N的时间复杂度t
是toInt
多少?
compiler-construction complexity-theory haskell pattern-matching
auto
几个CSS属性提供的选项非常有用.但是,该display
属性似乎没有.我希望这可以display
根据标签将属性设置为浏览器默认值; 例如,a <div>
会重置为display: block;
,但是<span>
会重置为display: inline;
.
display: auto
相同的我错过了?我正在使用Google“GSI”库实现“使用 Google 登录” 。我的应用程序使用 Next.js 和 TypeScript,所以我正在寻找:
npm
包含 GSI 客户端库的包。我无法找到其中任何一个:我只看到一个从中加载的脚本https://accounts.google.com/gsi/client
,以及一个非正式的 API 参考here。
在 npm 上哪里可以找到 GSI 库和类型声明?
TreeSet
我的应用程序中有两个:
set1 = {501,502,503,504}
set2 = {502,503,504,505}
Run Code Online (Sandbox Code Playgroud)
我想获得这些集的对称差异,以便我的输出将是集合:
set = {501,505}
Run Code Online (Sandbox Code Playgroud) haskell ×3
bash ×2
collections ×1
concurrency ×1
css ×1
fiber ×1
ghc ×1
java ×1
latency ×1
list ×1
npm ×1
path ×1
performance ×1
pointfree ×1
process ×1
python ×1
scripting ×1
set ×1
typescript ×1