小编Jo *_* So的帖子

Python:快速和脏数据类型(DTO)

很多时候,我发现自己编写了像琐碎的数据类型

class Pruefer:
    def __init__(self, ident, maxNum=float('inf'), name=""):
        self.ident  = ident
        self.maxNum = maxNum
        self.name   = name
Run Code Online (Sandbox Code Playgroud)

虽然这非常有用(显然我不想用匿名的3元组替换上面的内容),但它也是非常有用的.

现在例如,当我想在dict中使用该类时,我必须添加更多类似的样板

    def __hash__(self):
        return hash(self.ident, self.maxNum, self.name)
Run Code Online (Sandbox Code Playgroud)

我承认在我的所有样板类中都可能很难识别出一般模式,但我仍然喜欢这个问题:

  • 在python中是否有任何流行的习惯用来获取带有命名访问器的快速和脏数据类型?

  • 或许如果没有,也许Python大师可能想展示一些元类黑客或类工厂,让我的生活更轻松?

python dto

17
推荐指数
3
解决办法
8377
查看次数

Haskell程序以"循环"中止,但我认为不应该

我有这个Haskell代码,当用GHC编译并运行时,检测到循环中止.

data Foo = Foo ()
 deriving (Eq,Show)

type Foop = Foo -> ((),Foo)

noOp :: Foop
noOp st = ((),st)

someOp :: Foop
someOp st@(Foo x) = ((),st)

(<+>) :: Foop -> Foop -> Foop
(<+>) f g st = let ((_,st'),(_,st'')) = ((f st),(g st')) in ((),st'')

main = print $ (noOp <+> someOp) $ Foo ()
Run Code Online (Sandbox Code Playgroud)

我认为不应该,这里有一些修改.它们中的每一个都使循环消失:

  • 改变data Foonewtype Foo
  • 改变(noOp <+> someOp)(someOp <+> noOp)
  • 消除解构 @(Foo x)

这是GHC中的错误还是我对评估过程缺乏了解?

haskell

13
推荐指数
2
解决办法
829
查看次数

为什么从我的脚本中删除所有NUL?

它似乎是bash,也是破折号,从我的脚本中过滤掉任何ASCII NUL.

$ printf 'test="\000a" ; echo ${#test}' | sh
1
$ printf 'test="\001a" ; echo ${#test}' | sh
2
$ printf 'ec\000ho test' | sh
test
$ # (Same for bash)
Run Code Online (Sandbox Code Playgroud)

虽然我同意使用NUL是一个坏主意(例如传递给程序的参数使用NUL终止的字符串),但我没有看到POSIX标准批准这种行为的位置.

当此行为决定文件的语法正确性时,情况会变得更糟.

$ printf 'echo "\\\000"' | sh
sh: Syntax error: Unterminated quoted string
$ printf 'echo "\\\000"' | bash
bash: line 1: unexpected EOF while looking for matching `"'
bash: line 2: syntax error: unexpected end of file
$ printf 'echo "\\\134"' | sh
\ …
Run Code Online (Sandbox Code Playgroud)

bash sh

11
推荐指数
1
解决办法
337
查看次数

C++代码和C版本宏

预计这将是一个非常具体的问题.这可能是因为我缺乏一些谷歌搜索无法找到的基本知识.如果更有意义,请随意回答问题的更一般版本.

给定一些C++代码,我想知道它的具体标准版本是否(以及如何),以及它的C标准版本(如果有的话)是否相关.

我已经验证了这个测试代码

#include <cstdio>
int main(void)
{
    printf("%ld\n", _POSIX_C_SOURCE);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用"g ++ -std = c ++ 98","g ++ -std = c ++ 11","clang ++ -std = c ++ 98","clang ++ -std = c ++"编译时打印"200809" 11" .

(当我使用任何显式标准版本编译C时,根本没有定义_POSIX_C_SOURCE宏).

这是为什么?完全没有意义的是,在_POSIX_C_SOURCE中编译C++ 98效果为200809(即10年).

c c++

10
推荐指数
2
解决办法
988
查看次数

只要我不使用它,我可以安全地创建对可能无效内存的引用吗?

我想用C++解析UTF-8.在解析一个新字符时,我事先并不知道它是一个ASCII字节还是一个多字节字符的领导者,而且我也不知道我的输入字符串是否足够长以包含剩余的字符.

为简单起见,我想命名为下一个四个字节a,b,cd,因为我在C++中,我想用引用做到这一点.

只要在我知道访问安全之前我不访问它们,在函数开头定义这些引用是否有效?例:

void parse_utf8_character(const string s) {
    for (size_t i = 0; i < s.size();) {
        const char &a = s[i];
        const char &b = s[i + 1];
        const char &c = s[i + 2];
        const char &d = s[i + 3];

        if (is_ascii(a)) {
            i += 1;
            do_something_only_with(a);
        } else if (is_twobyte_leader(a)) {
            i += 2;
            if (is_safe_to_access_b()) {
                do_something_only_with(a, b);
            }
        }
        ...
     }
}
Run Code Online (Sandbox Code Playgroud)

上面的例子显示了我想要在语义上做什么.它没有说明我为什么要这样做,但显然真正的代码会更复杂,所以只有当我知道访问是安全的并且我需要它们时才会定义b,c,d会过于冗长.

c++

8
推荐指数
1
解决办法
175
查看次数

Haskell:将列表分成3元组

理解Haskell(Monads等)的基本原理,但是两年没用过它,我已经挣扎了两个小时干净地完成这个小小的练习:

我想将一行3*n整数(如in "1 1 1 2 2 2 3 3 3")转换为3元组的列表Int(如[(1,1,1),(2,2,2),(3,3,3)].

这应该以一种直接的,错误捕捉的方式完成.

到目前为止,我能想出的最佳解决方案包含以下内容:

groupsOf3 :: [a] -> Maybe [(a,a,a)]
groupsOf3 list =
    let fun l = case l of
            []           -> []
            (x:y:z:rest) -> (Just (x,y,z)) : (fun rest)
            _            -> [Nothing]
    in sequence $ fun list
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎并不优雅.我如何更多地编写此功能(具有相同的界面)?

haskell

8
推荐指数
1
解决办法
862
查看次数

Haskell - 模糊类型变量

我在几个模糊的类型变量错误问题中找不到我的问题的答案.

基本上我想将类型信息带到值级别.此示例中的最后一行失败.

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeOperators #-}

module Test where

data Typ = TInteger | TString deriving Show

data Empty = Empty
data a ## b = Cons a b

class Typical a b | a -> b where
    typical :: a -> b

instance Typical Empty [Typ] where
    typical _ = []

instance Typical Integer Typ where
    typical _ = TInteger

instance Typical String …
Run Code Online (Sandbox Code Playgroud)

haskell

8
推荐指数
1
解决办法
270
查看次数

Vim:使用制表符进行缩进,使用空格与C源文件对齐

是否有人使用硬标签作为缩进字符进行她的vim设置,但确实使用空格进行对齐?我遇到的问题是,当启动一个延续线时

if (condition1 && (anotherlongcondition || /* <-- Here I insert a newline */
|-------|-------   whatever  /* some additional alignment added automatically */
Run Code Online (Sandbox Code Playgroud)

,然后cin(这是我必须的)增加了一些调整只是我喜欢的方式位置上,但是这对准利用尽可能多的硬标签尽量和填充用空格休息创建(当我试着想象).

因此,简而言之,cin似乎并没有真正区分缩进对齐.我真的很喜欢上面例子中所有添加的对齐方式都是空格.这样,ts临时切换时可以正确保持对齐.

为了再次说清楚,我希望能够编写以下代码,永远不要按<TAB><SPACE>在任何行中的第一个非空白字符前面(并且不做任何手动移动或其他):

void foo(int bar)
{
|-------somestatement;
|-------if (somecondition && (someothercondition ||
|-------                      whatevercomesnext))
|-------|-------dosomething;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过ctab.vim,但它专注于编辑带有软选项卡的对齐线,这对我来说似乎很愚蠢,因为手动对齐是一项任务,它提供了一步细化而不是标签宽度步骤细化.我没有改变cin使用混合标签和空格进行对齐的方式.

我没有设法找到任何内置的方法来实现这一目标.也许还有一个?无论如何,我怀疑有一个插件可以做到这一点.虽然我承认自己没有自己编写脚本并且可能没有足够的经验,但我必须说我尝试过的大多数插件都搞砸了我的编辑器配置......

vim indentation alignment auto-indent

7
推荐指数
1
解决办法
1296
查看次数

从构造函数捕获异常而不将对象隐藏在try块中

我有一个类,其构造函数可能会抛出异常.

class A {
    A() { /* throw exception under certain circumstances */ }
};
Run Code Online (Sandbox Code Playgroud)

我想在客户端捕获此异常以获取堆栈分配的实例.但是我发现自己被迫扩展try块,至少在实例必须存活的时候.

try {
    A a;
    do_something(a);
} catch {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在,当try块太大而无法追踪异常源时,这显然会成为一个问题:

try {
    A a1;
    A a2;
    do_something(a1, a2);
} catch {
    // Who caused the exception?
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能避免这种情况?

更新:

似乎我没有很好地解释这个问题:出于显而易见的原因,我想让try块跨越尽可能少的代码(也就是说,只有构造).

但是这会产生一个问题,我之后无法使用这些对象,因为它们已经超出了范围.

try {
    A a1;
} catch {
    // handle a1 constructor exception
}
try {
    A a2;
} catch {
    // handle a2 constructor exception
}

// not …
Run Code Online (Sandbox Code Playgroud)

c++ exception

7
推荐指数
1
解决办法
864
查看次数

比scanf更快?

我正在使用大量解析正整数scanf("%d", &someint).正如我想看看scanf是否是一个瓶颈,我实现了一个天真的整数解析函数fread,就像:

int result;
char c;

while (fread(&c, sizeof c, 1, stdin), c == ' ' || c == '\n')
    ;

result = c - '0';
while (fread(&c, sizeof c, 1, stdin), c >= '0' || c <= '9') {
     result *= 10;
     result += c - '0';
}

return result;
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,这个功能的表现(即使内联)也差了不到50%.对于特殊情况,是否应该有可能改进scanf?不fread应该是快速的(附加提示:整数是(编辑:大多数)1或2位数?)?

c input scanf numeric-input

6
推荐指数
1
解决办法
5963
查看次数

标签 统计

c++ ×3

haskell ×3

c ×2

alignment ×1

auto-indent ×1

bash ×1

dto ×1

exception ×1

indentation ×1

input ×1

numeric-input ×1

python ×1

scanf ×1

sh ×1

vim ×1