标签: lexical

需要结束可以正常死亡的词法范围动作

我需要能够在动作可能会死的词块中添加动作.而且我需要正常抛出异常并且能够被正常捕获.

不幸的是,在DESTROY期间Perl特殊情况例外通过在消息中添加"(清理)"并使它们无法覆盖.例如:

{
    package Guard;

    use strict;
    use warnings;

    sub new {
        my $class = shift;
        my $code = shift;
        return bless $code, $class;
    }

    sub DESTROY {
        my $self = shift;
        $self->();
    }
}

use Test::More tests => 2;

my $guard_triggered = 0;

ok !eval {
    my $guard = Guard->new(
#line 24
        sub {
            $guard_triggered++;
            die "En guarde!"
        }
    );
    1;
}, "the guard died";

is $@, "En guarde! at $@ line 24\n",    "with the right error message";
is …
Run Code Online (Sandbox Code Playgroud)

perl exception lexical

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

PHP在匿名函数/闭包中是否具有词法范围?

我正在使用PHP 5.4,并想知道我正在制作的匿名函数是否有词法范围?

即如果我有一个控制器方法:

protected function _pre() {
    $this->require = new Access_Factory(function($url) {
        $this->redirect($url);
    });
}
Run Code Online (Sandbox Code Playgroud)

当Access Factory调用它传递的函数时,$ this会引用它定义的Controller吗?

php closures lexical

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

重用MySQL解析器

我正在研究SQL 入侵检测系统(IDS),我需要解析传入的SQL查询.编写自己的SQL解析器是一项长期任务,它永远不会完全反映本机解析器中使用的逻辑.我发现MySQL有一个带有主源文件的词法分析器sql/sql_lex.cc和一个用bison构建的语法分析器sql/sql_yacc.y.我真的很有兴趣重用这个强大的解决方案.我正在用C/C++构建我的IDS,所以我正在寻找一些方法将MySQL解析器与我的检测系统连接起来.

我想知道是否有可能重用MySQL解析器(词法+语法分析器)以某种逻辑形式获得SQL查询的结构,例如语法树.可能吗?是否有一些相关的文字,教程或项目?

谢谢

mysql sql syntax parsing lexical

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

为什么我不能使用Perl变量的值来访问词法变量名?

为什么打印42:

$answer = 42;
$variable = "answer";

print ${$variable} . "\n";
Run Code Online (Sandbox Code Playgroud)

但这不是:

my $answer = 42;
my $variable = "answer";

print ${$variable} . "\n";
Run Code Online (Sandbox Code Playgroud)

variables perl metaprogramming lexical

6
推荐指数
4
解决办法
903
查看次数

这里适当关闭是什么意思

这是Perl Cookbook直接推出的代码:

@colors = qw(red blue green yellow orange purple violet);
for my $name (@colors) {
no strict 'refs';
*$name = sub { "<FONT COLOR='$name'>@_</FONT>" };
}
Run Code Online (Sandbox Code Playgroud)

它的目的是形成6个不同颜色名称的子程序.在解释部分,该书内容如下:

这些函数看起来都是独立的,但实际代码实际上只编译了一次.这种技术节省了编译时间和内存使用.要创建正确的闭包,匿名子例程中的任何变量都必须是词法.这就是我在循环迭代变量上的原因.

什么是适当的闭合,如果my省略会发生什么?另外,一个typeglob如何使用词法变量,即使不能为词法变量定义typeglobs并且应该抛出错误?

perl closures subroutine typeglob lexical

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

JavaScript 的词法环境如何维护嵌套块范围内的变量声明?

我已经阅读了几篇关于执行上下文的更全面的文章,现在我有点困惑和头脑混乱。

为了使问题尽可能简短,避免长时间引用,我最好尝试通过一个专注于我无法获得的细节的示例来说明我的心理模型,以便您可以纠正我并指出错误。

下面是一个例子:

var tomato = 'global tomato';

{
  let tomato = 'block tomato';
  console.log(tomato); // 'block tomato'
}

console.log(tomato); // 'global tomato'
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都清楚了。当 JS 引擎创建一个执行上下文(在我们的例子中是全局的)var tomato时,第一行的声明被放置到一个块范围内的Variable Environmentwhile 中let tomato,进入了一个Lexical Environment. 这解释了我们如何最终得到 2 个不同的西红柿。

现在,让我们添加另一个番茄,如下所示:

var tomato = 'global tomato';

{
  let tomato = 'block tomato';

  {
    console.log(tomato); // ReferenceError: Cannot access 'tomato' before initialization
    let tomato = 'nested block tomato';
  }

  console.log(tomato); // won't reach here
}

console.log(tomato); // won't reach …
Run Code Online (Sandbox Code Playgroud)

javascript callstack lexical lexical-scope hoisting

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

什么时候应该使用包变量和词法变量(有什么区别)?

我在Perl Monks上查看一些较旧的Perl代码,以找出使用Win32 :: OLE和MS Word编程.整个代码中分散的是名为$ MS :: Word之类的变量,其声明中没有包含" my ".在Google上阅读了一下之后,我明白这些被称为"包变量"与使用的声明的"词汇变量" .

我的第一个问题是' 什么是包变量有用?".我(想)我理解词汇变量是什么,但我不明白包变量的目的或它们的用法与词汇有何不同,所以我的第二个问题是,' 词法和包变量有什么区别?"

variables perl scope package lexical

5
推荐指数
3
解决办法
2896
查看次数

Haskell:字符'i'中字符串/字符文字的词汇错误

我对Haskell编程很新,我无法理解为什么我在代码中收到此错误.

我的问题如下:任何正整数i可以表示为i = 2 ^ n*k,其中k是奇数,即,作为奇数的2倍的幂.我们在i中将n的指数称为n.例如,40的2的指数是3(因为40 = 2 ^ 3*5),而42的2的指数是1.如果i本身是奇数,则n是零.另一方面,如果我是偶数,那意味着它可以除以2.写一个函数exponentOfTwo,用于在其参数中找到2的指数.

我理解伪代码并且看起来相当简单:递归地将i除以2直到结果为奇数,除法发生的次数是n

这是我的代码(第31-32行):

exponentOfTwo :: Int -> Int  
exponentOfTwo i = if odd i then 0 else 1 + exponentOfTwo (i 'div' 2)  
Run Code Online (Sandbox Code Playgroud)

我在第32行第62列收到错误"字符'i'的字符串/字符文字中的词汇错误".

我试图在任何地方寻找解决这个错误的方法,到目前为止我没有运气.

recursion haskell lexical

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

是否可以通过词法范围进行硬实时操作?

我正在阅读关于funarg问题的这篇论文,这实际上是维护词汇闭包环境的问题.这是一篇旧论文,我不确定作者的结论是否仍然成立,但他强烈暗示,为了拥有词汇而非动态范围,你必须放弃传统的C风格的堆栈,而是拥有一个树形结构从堆中分配的环境.

这是否使得在任何硬实时系统中都无法使用词法范围的闭包?在以微秒为单位测量延迟的实时嵌入式系统中,由于引入的非确定性延迟,通常禁止堆分配.

这一直是我的好奇心,因为我把面包主要作为固件开发人员,其中C是事实上的语言,有一段时间我现在似乎一直在利用我的脑力来弄清楚如何强迫C让我用更复杂的语言免费做一些事情.因此,我开始怀疑您是否可以专门为基于硬件实时嵌入式微控制器的系统实现micro-lisp编译器.

作为旁注:我最近深入了解了关于封闭和物体如何等等的深层主题,它让我更加敬畏像Stallman和Rich Hickey以及Paul Graham这样的人.从头开始实现Lisp对我来说似乎是一项艰巨的任务.很难知道从哪里开始.(也许PG的实施麦卡锡的原始评估功能,IDK).无论如何,我离题了.

lisp embedded scope real-time lexical

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

关于R中的词汇范围

我是R的新手,当我阅读手册时,我遇到了一个关于词法范围的段落以及这个代码示例:

 open.account <- function(total) {
   list(
     deposit = function(amount) {
       if(amount <= 0)
         stop("Deposits must be positive!\n")
       total <<- total + amount
       cat(amount, "deposited.  Your balance is", total, "\n\n")
     },
     withdraw = function(amount) {
       if(amount > total)
         stop("You don't have that much money!\n")
       total <<- total - amount
       cat(amount, "withdrawn.  Your balance is", total, "\n\n")
     },
     balance = function() {
       cat("Your balance is", total, "\n\n")
     }
   )
 }

 ross <- open.account(100)
 robert <- open.account(200)

 ross$withdraw(30)
 ross$balance()
 robert$balance()

 ross$deposit(50)
 ross$balance()
 ross$withdraw(500) …
Run Code Online (Sandbox Code Playgroud)

variables scope r lexical lexical-scope

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