我试图从Vim切换到Emacs几个月并遇到了一个奇怪的问题:当font-lock打开时,在emacs中滚动变得非常慢.配置相关部分的示例:
(require 'vimpulse)
(require 'font-lock)
(require 'color-theme)
(global-font-lock-mode 1)
;;(setq font-lock-maximum-decoration t
;;font-lock-maximum-size nil)
;;(setq font-lock-support-mode 'fast-lock-mode ; lazy-lock-mode
;; fast-lock-cache-directories '("~/.emacs-flc"))
Run Code Online (Sandbox Code Playgroud)
即使是以几百行开头的相对较小的文件,它也很慢.似乎这不是一个非常普遍的问题,因为到目前为止我没有找到任何明确的解决方案.
GNU Emacs 23.1.1 Ubuntu 10.04
是否有任何解析器组合库可以提供与Happy/Alex相媲美的性能?
我知道Attoparsec,但有时它运行得不好,如下例所示:
isToken c = isLetter c || isDigit c
symbol :: Parser Expr
symbol = do
c <- skipSpace >> satisfy isLetter
rest <- takeWhile isToken
let token = C.cons c rest -- oops... O(N)
error $ show token
Run Code Online (Sandbox Code Playgroud)
解决方法非常难看:
do { skipSpace; bs <- scan go True; when (null bs) (fail "Not a symbol"); return bs}
where go True c = if isLetter c then Just False else Nothing
go False c = if isToken c then Just …Run Code Online (Sandbox Code Playgroud) 是否有可能表达一种monad"C++?我开始写这样的东西,但卡住了:
#include <iostream>
template <typename a, typename b> struct M;
template <typename a, typename b> struct M {
virtual M<b>& operator>>( M<b>& (*fn)(M<a> &m, const a &x) ) = 0;
};
template <typename a, typename b>
struct MSome : public M<a> {
virtual M<b>& operator>>( M<a>& (*fn)(M<a> &m, const a &x) ) {
return fn(*this, x);
}
private:
a x;
};
M<int, int>& wtf(M<int> &m, const int &v) {
std::cout << v << std::endl;
return m;
}
int main() { …Run Code Online (Sandbox Code Playgroud) 如果使用副作用,有没有正确的方法使TH的功能安全?说,我想要一个在编译时调用git并生成版本字符串的函数:
{-# LANGUAGE TemplateHaskell #-}
module Qq where
import System.Process
import Language.Haskell.TH
version = $( [| (readProcess "git" ["rev-parse", "HEAD"] "") |] )
Run Code Online (Sandbox Code Playgroud)
版本的类型是IO String.但是版本在运行时完全没有副作用,它只在编译时有副作用.有没有办法在不使用unsafePerformIO的情况下在运行时使其纯粹?
假设我们有以下数据类型:
data Cmd = Cmd0 Opcode | Cmd1 Opcode Arg | Cmd2 OPcode Arg Arg
data Opcode = NOP | INC | ADD | MUL deriving (Enum)
data Arg = W32 Int | W16 Int | W8 Int
Run Code Online (Sandbox Code Playgroud)
我们的想法是使用Opcode类型生成顺序操作码编号.有没有办法为Cmd值指定约束,比如说:Cmd0只有NOP操作码,Cmd1只有INC,Cmd2只有ADD或MUL值.我试图使用GATD,但它们按类型而不是值进行操作.
或者反之亦然有没有办法为Cmd的每个值生成一个连续的操作码,而无需手动或不使用TH为每个值声明fromEnum方法?
对于一个实例,有一项任务是为后缀列表构建某种字典:
[., .com., a.com., a.b.com., org., some.org., ...]
Run Code Online (Sandbox Code Playgroud)
对于每个传入的字符串,对于一个实例"test.some.org".找到构建字典中最长的后缀.存在一些内存限制.这种情况下最合适的算法/数据结构是什么?
对我来说最明显的选择是反向字符串的trie,但它似乎非常耗费内存.我试过使用后缀数组,但看起来它不适合任务.
字典是不可变的,它必须构建一次.不可变尝试的内存效率表示是否更高?
是否有任何推荐的方法来使用类型类来模拟类似OCaml的参数化模块?
例如,我需要实现复杂泛型计算的模块,可以用不同的misc进行分解.更具体地说,让它成为kMeans实现,可以使用不同类型的值,矢量类型(列表,未装箱的矢量,矢量,元组等)和距离计算策略进行参数化.
为方便起见,为了避免疯狂数量的中间类型,我希望DataSet类具有多态性,包含所有必需的接口.我还尝试使用TypeFamilies来避免大量的类型参数(这也导致了问题):
{-# Language MultiParamTypeClasses
, TypeFamilies
, FlexibleContexts
, FlexibleInstances
, EmptyDataDecls
, FunctionalDependencies
#-}
module Main where
import qualified Data.List as L
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as U
import Distances
-- contains instances for Euclid distance
-- import Distances.Euclid as E
-- contains instances for Kulback-Leibler "distance"
-- import Distances.Kullback as K
class ( Num (Elem c)
, Ord (TLabel c)
, WithDistance (TVect c) (Elem c)
, WithDistance (TBoxType c) (Elem c) …Run Code Online (Sandbox Code Playgroud) 你能为C证明一个经过验证的二进制流解析库吗?如果它像C允许的那样具有声明性,那将是很好的.
我需要它用于二进制协议解析并通过它的正式规范描述相当复杂的协议,这就是为什么我希望它尽可能多的声明.像Haskell的Data.Binary.Get之类的东西会很棒.
我发现了binpac,但它看起来很重量级并且面向C++,但该项目是纯粹的C.
描述我的意思的例子:
parser_t parsers[] = {
{ get_bit, out_field1, &pkt.field1 }
,{ get_bit7, 0, 0 } // skip 7 bits
,{ get_word16be, out_field2, &pkt.field2 }
,{ 0, 0, 0 } // end
};
// skip
// char *data, char *data_end,
map_parsers(data, data_end, parsers); // parse stream
Run Code Online (Sandbox Code Playgroud)
UPD.只有一个快速库可以从内存中顺序读取位,字,对齐,未对齐等.我可以自己编写声明式前端甚至DSL.