我有一些正则表达式regex1,regex2...,regexN组合成一个正则表达式regex1|regex2|...|regexN.我想重新排序组件表达式,以便组合表达式在给定字符串的开头给出最长的匹配.
我相信这意味着重新排序正则表达式,"如果regexK匹配前缀regexL,那么L < K".如果这是正确的,通常是否regexK可以找出是否可以匹配前缀regexL?
我想在Python中编写一个函数,它将一个切片作为参数.理想情况下,用户可以按如下方式调用该函数:
foo(a:b:c)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种语法不Python允许-使用a:b:c只允许范围内[],没有().
因此,我认为我的功能有三种可能性:
要求用户使用切片"构造函数"(其s_行为类似于numpy提供的版本):
foo(slice(a, b, c))
foo(s_[a:b:c])
Run Code Online (Sandbox Code Playgroud)将我的函数的逻辑放入一个__getitem__方法:
foo[a:b:c]
Run Code Online (Sandbox Code Playgroud)放弃尝试切片并单独开始,停止和步骤:
foo(a, b, c)
Run Code Online (Sandbox Code Playgroud)有没有办法让原始语法工作?如果不是,首选哪种解决方法语法?或者还有另一种更好的选择吗?
如果我将Python解释器嵌入到C或C++程序中,如本例所示,有没有办法限制解释器运行的时间?有没有什么可以阻止Python代码进入无限循环,从而阻止PyObject_CallObject(或等效)返回?
类似地,如果Python代码创建了一个新线程,那么有什么东西可以阻止这个线程进入无限循环并永远运行吗?
我正在编写一个Python模块,其目的是导出单个数据结构.我相信这意味着我的模块应该导出单个符号(例如foo),其所有其他符号都以下划线为前缀.
生成数据结构需要相当多的代码 - 我应该如何构建模块以确保在没有前缀的情况下导出此代码中的符号?两种可能的方法是:
将生成代码放在顶层,小心使用整个下划线,例如:
_bar = ...
for _i in ...:
_bar.append(...)
foo = [_bar, ...]
Run Code Online (Sandbox Code Playgroud)将生成代码放在返回数据结构的函数中.这只需要函数名称来使用下划线.例如:
def _generate_foo():
bar = ...
for i in ...:
bar.append(...)
return [bar, ...]
foo = _generate_foo()
Run Code Online (Sandbox Code Playgroud)这些方法中哪一个被认为更好?或者,是否有另一种方法来构建这个模块,这是首选的?
根据维基百科上的"递归下降解析器",只有LL(k)语法才能实现没有回溯(也就是预测解析)的递归下降.
在其他地方,我已经读过Lua的实现使用这样的解析器.但是,该语言不是 LL(k).事实上,Lua天生就是含糊不清的:是a = f(g)(h)[i] = 1指a = f(g); (h)[i] = 1还是a = f; (g)(h)[i] = 1?这种歧义通过解析器中的贪婪来解决(因此上面被解析为错误的a = f(g)(h)[i]; = 1).
这个例子似乎表明预测解析器可以处理不是LL(k)的语法.事实上,它们是否能够处理LL(k)的超集?如果是这样,有没有办法找出一个给定的语法是否在这个超集中?
换句话说,如果我正在设计一种我想使用预测解析器解析的语言,我是否需要将语言限制为LL(k)?或者我可以适用更宽松的限制吗?
lua parsing recursive-descent context-free-grammar ll-grammar
最新版本的Visual Studio已经看到了对C99的改进支持.最新版本VS2017现在支持所有C99吗?
如果没有,C99的哪些功能仍然缺失?
这个问题类似于我最近提出的关于LLVM的问题.
V8在手动管理的堆上分配JavaScript对象,其内存最终从mmap/VirtualAlloc(在Linux/Windows上)获得.但是,对于其内部数据结构,V8 使用C++标准容器,如std::vector.如果这些容器需要分配内存,但无法分配内存,它们通常会抛出std::bad_alloc.
但是,V8 是使用-fno-exceptions编译的.如果无法使用异常,V8如何处理内部数据结构无法分配内存的情况?它崩溃了吗?如果是这样,这会占用嵌入V8的任何进程吗?
M:N线程是将M个用户线程映射到N个内核线程的模型.这使得能够创建大量(M)用户线程,因为它们重量轻,仍然允许(N路)并行.
这对我来说似乎是一个双赢,那么为什么这么少的语言/实现使用这个线程模型呢?我所知道的唯一例子是Go的"goroutines"和Erlang的流程.
M:N线程有哪些缺点?为什么其他语言不使用这种表面看起来很有前途的线程模型呢?
language-agnostic erlang multithreading programming-languages go
本文介绍Python在执行时如何在对象上查找属性o.a.优先顺序很有趣 - 它寻找:
我们可以使用下面的代码确认这一点,该代码创建一个o具有实例属性的对象a,该类的类包含同名的属性:
class C:
def __init__(self):
self.__dict__['a'] = 1
@property
def a(self):
return 2
o = C()
print(o.a) # Prints 2
Run Code Online (Sandbox Code Playgroud)
为什么Python使用此优先级顺序而不是"天真"顺序(实例属性优先于所有类属性)?Python的优先级顺序有一个明显的缺点:它使属性查找速度变慢,因为oPython必须首先搜索o的类及其所有超类以获取数据描述符,而不仅仅返回if存在的属性(常见情况).
Python的优先顺序有什么好处?它可能不仅仅适用于上述情况,因为拥有一个实例变量和一个同名属性是一个极端情况(注意需要self.__dict__['a'] = 1用来创建实例属性,因为通常self.a = 1会调用该属性).
是否存在"天真"查找顺序会导致问题的不同情况?
python ×4
c ×1
c++ ×1
c99 ×1
compilation ×1
descriptor ×1
erlang ×1
exception ×1
go ×1
javascript ×1
jit ×1
ll-grammar ×1
lua ×1
luajit ×1
module ×1
numpy ×1
oop ×1
parsing ×1
properties ×1
pypy ×1
regex ×1
sandbox ×1
slice ×1
stl ×1
v8 ×1