和Cabal一起工作真是太累了,我拿着我最新工作的.cabal文件的副本,这样当其他一些软件包(特别是像hakyll这样需要永久重新安装的可执行文件)被破坏时,我可以从最新的保存点重新加载.
但它仍然没有使一些东西更容易,因为我不能安装一些包,而不是以不同的顺序完全安装我的包(即打破其他包的包应该安装在别人之前等)
例如,这是我尝试安装时会发生什么cabal-dev(对我来说这是一个非常重要的包):
? ~ cabal install cabal-dev
Resolving dependencies...
In order, the following would be installed:
bytestring-0.9.2.1 (new version)
containers-0.4.2.1 (new version)
template-haskell-2.8.0.0 (reinstall) changes: containers-0.5.0.0 -> 0.4.2.1
text-0.11.2.3 (reinstall) changes: bytestring-0.10.0.0 -> 0.9.2.1
transformers-0.2.2.0 (new version)
mtl-2.0.1.0 (new version)
parsec-3.1.3 (reinstall) changes: bytestring-0.10.0.0 -> 0.9.2.1, mtl-2.1.2 ->
2.0.1.0
unix-2.3.2.0 (new version)
directory-1.0.0.3 (new version)
network-2.3.2.0 (new version)
HTTP-4000.2.6 (reinstall) changes: bytestring-0.10.0.0 -> 0.9.2.1, mtl-2.1.2
-> 2.0.1.0, network-2.4.0.1 -> 2.3.2.0
process-1.1.0.2 (reinstall) changes: directory-1.2.0.0 -> 1.0.0.3,
unix-2.6.0.0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个vim语法文件,我正在处理的一个问题是vim的正则表达式语法与大多数其他语言不同(我认为一个名为"perl兼容正则表达式",Python,JavaScript等使用大多数相同的正则表达式语法)所以我不能使用像regexpal这样的正则表达式测试程序.
尝试vim正则表达式的最简单方法是什么?理想情况下我想要的是两个分割,一个是我写vim正则表达式,另一个是文本,匹配的部分应该突出显示.
提前致谢.
编辑:我添加了Ingo Karkat的修改版本的答案.vimrc:
nnoremap <F5> mryi":let @/ = @"<CR>`r
Run Code Online (Sandbox Code Playgroud)
此版本还将光标放回到按下F5时的位置,以及丢失标记的成本r.
我正在阅读这里的 GADT介绍,我发现限制程序员创建只有正确类型的语法树很好的想法,我把这个想法放到我的简单lambda演算解释器中,但后来我意识到我无法解析字符串到这个语法树,因为一个解析函数需要返回不同类型的语法树,具体取决于输入.这是一个例子:
{-# LANGUAGE GADTs #-}
data Ident
data Lambda
data Application
data Expr a where
Ident :: String -> Expr Ident
Lambda :: Expr Ident -> Expr a -> Expr Lambda
Application :: Expr a -> Expr a -> Expr Application
Run Code Online (Sandbox Code Playgroud)
在使用GADT之前,我使用的是:
data Expr = Lambda Expr Expr
| Ident String
| Application Expr Expr
Run Code Online (Sandbox Code Playgroud)
GADT在这里很有优势,现在我无法创建无效的语法树Lambda (Application ..) ...
但是使用GADT,我无法解析字符串并创建解析树.以下是Lambda,Ident和Application表达式的解析器:
ident :: Parser (Expr Ident)
ident = ...
lambda :: Parser (Expr Lambda)
lambda = ... …Run Code Online (Sandbox Code Playgroud) 我正在通过阅读"使用依赖类型的认证编程"一书来学习Coq,而我在学习forall语法方面遇到了麻烦.
作为一个例子让我们考虑这种互感的数据类型:(代码来自书中)
Inductive even_list : Set :=
| ENil : even_list
| ECons : nat -> odd_list -> even_list
with odd_list : Set :=
| OCons : nat -> even_list -> odd_list.
Run Code Online (Sandbox Code Playgroud)
这个相互递归的函数定义:
Fixpoint elength (el : even_list) : nat :=
match el with
| ENil => O
| ECons _ ol => S (olength ol)
end
with olength (ol : odd_list) : nat :=
match ol with
| OCons _ el => S (elength el)
end.
Fixpoint …Run Code Online (Sandbox Code Playgroud) 出于学习目的,我正在实施TCP(现在只是RFC 793),但我不知道如何测试它.互联网上的大多数TUN/TAP内容都已过时(例如Linux API调用不再起作用),并且没有足够的解释.此外,我觉得创建一个设备和转发包等不是学习目的的最佳方式.举例来说,我宁愿只覆盖socket(),
listen(),connect(),accept(),send(),recv()等程序中,而不是转发所有以太网流量的设备/程序负责bookeeping整个系统,而不是一个单独的程序.
我想知道这是否可行.如果没有,我想知道在Linux上测试TCP实现的最简单方法.
因为我正在关注RFC 793,所以如果我的应用程序中可以拥有IP(RFC中提到的Internet协议)API,那就太棒了.这是可能的还是我不得不搞乱TUN/TAP的东西?
谢谢..
两个插件都有良好的侧面,SLIMV有更好的REPL(比vimclojure REPL更快),但vimclojure的缩进和语法着色更好(同样,vimclojure的语法着色也在REPL中工作).而vimclojure的缩进更好.例如,这是函数的SLIMV缩进:
(defn func
[])
Run Code Online (Sandbox Code Playgroud)
这是vimclojure的:
(defn func
[])
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用两个插件,每个插件都有良好的侧面.我需要在SLIMV REPL和vimclojure缩进中进行语法着色.你有什么想法我该怎么做?
我试图理解亚历克斯和词法分析者的一般情况,但是我很难运行我的词法分析器.
我用"基本"和"posn"包装器写了词法分析器,但我不能用"monad"包装器.我想我必须使用monad包装器,因为我需要在输入中收集字符串和标记位置.我还需要多个州.现在我正试图运行这个简单的例子:
{
module Main (main) where
}
%wrapper "monad"
$whitespace = [\ \b\t\n\f\v\r]
$digit = 0-9
$alpha = [a-zA-Z_]
$upper = [A-Z]
$lower = [a-z]
@tidentifier = $upper($alpha|_|$digit)*
@identifier = $lower($alpha|_|$digit)*
tokens :-
$whitespace+ ;
$upper $alpha+ { typeId }
$lower $alpha+ { id_ }
$digit+ { int }
{
data Lexeme = L AlexPosn LexemeClass String
data LexemeClass
= TypeId String
| Id String
| Int Int
| EOF
deriving (Show, Eq)
typeId :: AlexInput -> …Run Code Online (Sandbox Code Playgroud) 我正在分离lexing和解析解析器的各个阶段.经过一些测试后,当我使用除Parsec的Char标记之外的其他标记时,我意识到错误消息不太有用.
以下是使用Char令牌时Parsec的错误消息的一些示例:
ghci> P.parseTest (string "asdf" >> spaces >> string "ok") "asdf wrong"
parse error at (line 1, column 7):
unexpected "w"
expecting space or "ok"
ghci> P.parseTest (choice [string "ok", string "nop"]) "wrong"
parse error at (line 1, column 1):
unexpected "w"
expecting "ok" or "nop"
Run Code Online (Sandbox Code Playgroud)
因此,字符串解析器会在找到意外字符串时显示预期的字符串,而选择解析器会显示替代字符串.
但是当我使用与我的令牌相同的组合器时:
ghci> Parser.parseTest ((tok $ Ide "asdf") >> (tok $ Ide "ok")) "asdf "
parse error at "test" (line 1, column 1):
unexpected end of input
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它不会打印出预期的内容.
ghci> Parser.parseTest (choice [tok $ …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Clojure分析Java源文件,但我找不到办法做到这一点.
首先,我想使用Eclipse AST插件(通过将必要的JAR复制到我的Clojure项目中)但是在看到Eclipse AST的API(基于访问者的walker)后我放弃了.
然后我尝试用ANTLR创建一个Java解析器.我只能为ANTLR找到一个Java 1.6语法(http://openjdk.java.net/projects/compiler-grammar/antlrworks/Java.g)并且它不能用最新的ANTLR编译(这里是错误我'得到).
现在我不知道我该怎么做.在最坏的情况下,我会尝试使用Eclipse AST.
有谁知道用Clojure解析Java文件的更好方法?
谢谢.
编辑:澄清我的观点:我需要在Java项目中找到一些特定的方法调用并检查它的参数(我们有多个方法定义,具有不同类型的参数).现在我有一个用Java编写的简单解决方案(Eclipse AST),但我希望尽可能在这个项目中使用Clojure.
我的程序中有一个MonadIO实例,我想从MonadIO中抛出/捕获异常(来自Control.Exception基本包中的模块).
一个快速的谷歌搜索返回了很多讨论(约会2003年)和复杂的搜索(如实现MonadControlIO,MonadBase等实例),我想知道是否有一个简单/接受/广泛使用的解决方案,
如果没有,那么这个问题会有什么好处?据我所知,Hackage中有几个软件包可以解决这个问题,我应该使用哪一个?
(顺便说一句,建议我们为什么没有读数catch中MonadIO也将赞赏)
谢谢,
编辑:所以托马斯的答案工作正常,但我也想知道还有什么其他选择,我的主要目的是使用IO例外而不是ErrorT表现,我获得了一些表现Control.Monad.IO.Control(443389蜱与318552蜱之后),有没有更好的选择Control.Monad.IO.Control?