标签: language-implementation

Python中意外的列表理解行为

我相信我会被嵌套的范围规则和列表推导的某些组合所困扰. Jeremy Hylton的博客文章暗示了原因,但我并不完全理解CPython的实现,足以弄清楚如何解决这个问题.

这是一个(过于复杂的?)示例.如果人们有一个更简单的演示,我想听听它.问题:使用next()的列表推导用最后一次迭代的结果填充.

编辑:问题:

到底是怎么回事,我该如何解决这个问题?我是否必须使用标准循环?显然,该函数运行的次数正确,但列表推导最终得到的是最终值而不是每个循环的结果.

一些假设:

  • 发电机?
  • 懒惰填写列表理解?

import itertools
def digit(n):
    digit_list = [ (x,False) for x in xrange(1,n+1)]
    digit_list[0] = (1,True)
    return itertools.cycle ( digit_list)
Run Code Online (Sandbox Code Playgroud)
>>> D = digit(5)
>>> [D.next() for x in range(5)]
## This list comprehension works as expected
[(1, True), (2, False), (3, False), (4, False), (5, False)]
class counter(object):
    def __init__(self):
        self.counter = [ digit(4) for ii in range(2) ] 
        self.totalcount=0
        self.display = [0,] * 2
    def next(self):
        self.totalcount …
Run Code Online (Sandbox Code Playgroud)

python list-comprehension language-implementation

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

私有内部类合成意外的匿名类

当您使用私有内部类编译Java类时,似乎匿名类由于某种原因自动合成.这个类足以重现它:

public class SynthesizeAnonymous {
    public static void method() {
        new InnerClass();
    }

    private static class InnerClass {}
}
Run Code Online (Sandbox Code Playgroud)

编译时,这会生成预期的SynthesizeAnonymous.classSynthesizeAnonymous$InnerClass.class文件,但它也会生成一个奇怪的SynthesizeAnonymous$1.class文件,该文件对应java.lang.Object于合成的匿名子类.如果你看一下反汇编javap,看来默认的构造函数InnerClass获得了这个匿名类型的隐藏参数,并nullnew InnerClass()调用时传递给它.

为什么要创建这个类?即使InnerClass它不是静态的,也会创建它,但如果InnerClass不是私有的,或者没有InnerClass创建任何实例,则不会创建它.它是某种形式的访问控制?这是如何运作的?

java private language-implementation anonymous-class

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

Python:列表理解背后的机制

in在for循环上下文中使用list comprehension或关键字时,即:

for o in X:
    do_something_with(o)
Run Code Online (Sandbox Code Playgroud)

要么

l=[o for o in X]
Run Code Online (Sandbox Code Playgroud)
  • 背后的机制如何in运作?
  • X它调用哪些函数\方法?
  • 如果X能够遵循多种方法,那么优先级是什么?
  • 如何写出高效的X,这样列表理解会很快?

python implementation list-comprehension language-implementation

6
推荐指数
2
解决办法
2339
查看次数

如何在不使用"set!"的情况下实现"letrec"?

如何letrec在不使用的情况下实施set!

在我看来,这set!是一个命令式的编程结构,通过使用它,一个人失去了函数式编程的好处.

variables scheme language-implementation letrec

6
推荐指数
2
解决办法
1489
查看次数

如何为python中实现的语言添加回溯/调试功能?

我正在使用python来实现另一种名为'foo'的编程语言.所有foo的代码都将被转换为python,并且也将在同一个python解释器中运行,因此它将JIT转换为python.

这是一小段foo的代码:

function bar(arg1, arg2) {
    while (arg1 > arg2) {
        arg2 += 5;
    }
    return arg2 - arg1;
}
Run Code Online (Sandbox Code Playgroud)

这将转化为:

def _bar(arg1, arg2):
    while arg1 > arg2:
        arg2 += 5
        watchdog.switch()
    watchdog.switch()
    return arg2 - arg1
Run Code Online (Sandbox Code Playgroud)

'watchdog'是一个greenlet(生成的代码也在greenlet上下文中运行),它将监视/限制资源使用,因为该语言将运行不受信任的代码.

从示例中可以看出,在生成python代码之前,将对解析树进行小的更改,以便添加看门狗开关并对函数标识符进行小的更改.

为了满足所有的要求,我还必须为该语言添加回溯/调试功能,这样当python运行时抛出异常时,用户将看到的是foo的代码追溯(因为选择显示生成的python代码追溯).

考虑用户使用以下内容创建名为"program.foo"的文件:

1  function bar() {
2      throw Exception('Some exception message');
3  }
4
5  function foo() {
6      output('invoking function bar');
7      bar();
8  }
9
10 foo();
Run Code Online (Sandbox Code Playgroud)

这将转化为:

def _bar():
    watchdog.switch()
    raise Exception('Some exception message')

def _foo():
    print 'invoking …
Run Code Online (Sandbox Code Playgroud)

python jit language-implementation

5
推荐指数
1
解决办法
156
查看次数

spect.currentframe() 在某些实现下可能不起作用?

根据文档

\n\n
\n

inspect.currentframe()

\n\n

返回调用者\xe2\x80\x99s 堆栈\n 帧的帧对象。

\n\n

CPython 实现细节:此函数依赖于解释器中的 Python 堆栈框架支持,但不能保证在所有 Python 实现中都存在该支持。如果在没有 Python 堆栈框架支持的实现中运行,则此函数返回 None。

\n
\n\n

怎么只有这个函数被标记为“依赖于实现”?如果这个功能不行的话,类似的功能,比如inspect.traceinspect.stack等不是也无法使用吗?

\n\n

另外,“堆栈框架支持”是什么意思,为什么它会缺失?

\n

python stack language-implementation python-3.x

5
推荐指数
1
解决办法
2365
查看次数

为什么Boolean :: New()返回Handle <>而其他原语返回Local <>?

这些是在V8 C++ API中创建新原语的函数:

Handle<Boolean> v8::Boolean::New(bool value)
Local<Number> v8::Number::New(double value)
Local<String> v8::String::New(const char *data, int length=-1)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么Boolean返回Handle其他人返回一段时间Local.

我的假设是它与只有两个可能值的布尔有关,但不幸的是,文档真的很差,并没有提到类似的东西.

boolean v8 language-implementation

5
推荐指数
1
解决办法
1201
查看次数

实现JavaScript内部方法的源代码

有没有办法查看JavaScript方法背后的代码?不是网站的.html或.js文件中的javascript方法,而是JavaScript的内部方法。

例如:

  • 如何查看JavaScript如何计算offsetTop元素的?

javascript language-implementation

5
推荐指数
1
解决办法
637
查看次数

Java必须编译为字节码吗?

Java语言规范是否要求将Java编译为Java字节代码?

据我所知,事实并非如此:

JLS 1

编译时通常包括将程序转换为与机器无关的字节代码[表示.

[...]

Java编程语言通常被编译为Java虚拟机规范Java SE 9 Edition中定义的字节码指令集和二进制格式.

(强调我的)

我在规范中找不到任何其他提到的"字节码"或"字节码".

这是否意味着所有字节码操作在技术上都不被JLS定义的"Java语言"所涵盖,并且在技术上依赖于实现细节?

java bytecode language-implementation jls

5
推荐指数
1
解决办法
347
查看次数

自 C++20 以来,某些 C++ 标准库 constexpr 函数是否隐式允许为 consteval?

从C++20开始,有一些立即函数,在很多情况下无法获取其地址(P1073R3);大多数标准库函数都是不可寻址的(P0551R3)。

另外,有一些constexpr标准函数总是返回相同的常量值(例如标准std::numeric_limits专业化的静态成员函数,std::barrier<F>::max),并且它们都不是可寻址的。

实现可以将这些函数一致地更改为 吗consteval

我打算对标准库实现进行这样的更改,并在 MSVC STL 的存储库中进行了讨论,但到目前为止尚未收到任何答复。我还想知道这样的更改是否是一种改进,因为它可能会减少符号表的大小。

c++ language-implementation language-lawyer c++20

5
推荐指数
1
解决办法
164
查看次数