从Perl 5.10开始,现在可以在语义上或在构造中$_明确地对上下文变量进行范围限定.my $_;given / when
有没有人发现词汇的好用$_?它是否使任何构造更简单/更安全/更快?
如果情况变得更复杂呢?词法是否在$_您的代码中引入了任何错误?(因为写入的控制结构$_将使用词法版本,如果它在范围内,如果它包含任何子例程调用(由于动态范围的丢失),这可以改变代码的行为)
最后,我想构建一个清单,明确何时$_用作词汇,全局,或者根本不重要.
注意:由于perl5-5.24这些实验性特征不再是perl的一部分.
我正在使用Lexical Analyzer程序,我正在使用Java.我一直在研究这个问题的答案,但直到现在我都找不到.这是我的问题:
输入:
System.out.println ("Hello World");
Run Code Online (Sandbox Code Playgroud)
期望的输出:
Lexeme----------------------Token
System [Key_Word]
. [Object_Accessor]
out [Key_Word]
. [Object_Accessor]
println [Key_Word]
( [left_Parenthesis]
"Hello World" [String_Literal]
) [right_Parenthesis]
; [statement_separator]
Run Code Online (Sandbox Code Playgroud)
我还是初学者,所以我希望你们能帮助我.谢谢.
我想从 Lexical Rich Editor 中的 editorState 生成 HTML 格式,我可以使用 editorState 进行选择,什么最好保存到数据库、HTML 或某种 JSON 格式中?
我想在编辑器之外显示这个 HTML。这是一些代码示例
const onChange = (editorState) => {
const editorStateTextString = editorState.read(() => {
const selection = $getSelection();
console.log(selection);
return $getRoot().getTextContent();
});
// TODO: saving text only at the moment
if (changeHandler) {
changeHandler(editorStateTextString);
}
};
<LexicalComposer initialConfig={editorConfig}>
<div className="editor-container">
<ToolbarPlugin aditionalTools={aditionalTools} />
<div className="editor-inner">
<RichTextPlugin
contentEditable={<ContentEditable className="editor-input" />}
placeholder={<Placeholder placeholder={placeholder} />}
/>
<OnChangePlugin ignoreInitialChange onChange={onChange} />
</div>
</div>
</LexicalComposer>
Run Code Online (Sandbox Code Playgroud) 当我阅读Programming Perl,第2版,第51页时,有些东西让我困惑:
sub newopen {
my $path = shift;
local *FH; #not my!
open (FH, $path) || return undef;
return *FH;
}
$fh = newopen('/etc/passwd');
Run Code Online (Sandbox Code Playgroud)
我知道,为什么我们不会重新开始使用我的?到目前为止,如果我们使用my(),我看不出任何问题.
谢谢!
编辑:我在第一个答案后更改了示例代码,因为我提出了一个简单的版本,提出相同的问题.
我目前正在学习Common Lisp的范围属性.在我认为我有一个扎实的理解后,我决定编写一些我可以预测结果的例子,但显然我错了.我有三个问题,每个问题都与下面的例子有关:
例1:
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
*** - EVAL: variable X has no value
Run Code Online (Sandbox Code Playgroud)
问题:这是有道理的.x是静态范围的,fun2无法在没有显式传递的情况下找到x的值.
例2:
(defvar x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
5
Run Code Online (Sandbox Code Playgroud)
问题:我不明白为什么x对fun2突然可见,其值为fun1,而不是值为100 ...
例3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
100
Run Code Online (Sandbox Code Playgroud)
问题:我是否应该忽略这些结果,因为在未声明的变量上调用setf显然是未定义的?这恰好是我在第二个例子中所期望的......
任何见解将不胜感激......
Python-NLTK可以识别输入字符串并解析它不仅基于空格而且还基于内容?说,"计算机系统"成为这种情况下的一个短语.任何人都可以提供示例代码吗?
输入字符串:"用户对计算机系统响应时间的意见调查"
预期输出:["A","调查","of","用户","意见","of","计算机系统","响应","时间"]
这在Perl v5.22中得到修复.
Perl v5.18的词法子程序是否有排序?我今天终于有了一个用途,我有一个复杂的排序例程,它依赖于数据结构中的当前位置来查看更深的部分.
这是一个小程序:
use v5.18;
use feature qw(lexical_subs);
no warnings qw(experimental::lexical_subs);
my sub by_numbers { $a <=> $b }
my @sorted = sort by_numbers qw( 4 8 2 3 0 5 7 6 1 9 );
say "sorted: @sorted";
Run Code Online (Sandbox Code Playgroud)
显然sort对此一无所知,因为它仍然在寻找%main::命名子例程:
% perl5.18.2 test.pl
Undefined sort subroutine "main::by_numbers" called at test.pl line 7.
% perl5.20.1 test.pl
Undefined sort subroutine "main::by_numbers" called at test.pl line 7.
Run Code Online (Sandbox Code Playgroud)
我有点失望,因为这是rjbs 在perl 5中的词法子例程中使用的第一个用例.
这部分并不重要,因为我查看了当前版本的测试而不是v5.18版本. …
我正在阅读Java语言规范8.
我试图理解第2章.语法.
这是我已经学到的:
语义学:
语义学是对意义的研究.
含义:
在语义中,含义被定义为扩展:世界中单词/短语所指的东西,加上意图:单词/短语唤起的概念/心理图像.
语法:
语法是关于句子的结构,以及决定哪些单词去哪里的内容.
生产:
计算机科学中的生产或生产规则是指定符号替换的重写规则,可以递归地执行符号替换以生成新的符号序列.
字母:
非空集在被指示用于字符串操作时称为字母表.
Lexeme:
lexeme是一串字符,形成一个句法单位.
句法单位:
句子是"最高"(即最大)的句法单位,
最低(即最小)的句法单位是单词,
中间句法单位是短语.
令牌:
令牌是表示词汇的结构,该词汇明确指出其用于解析的分类.
语法:
语法(当没有给出上下文时,为了清楚起见通常称为正式语法)是一组用于正式语言的字符串的生成规则.规则描述了如何根据语言的语法从语言的字母表中形成有效的字符串.形式语法是一组用于重写字符串的规则,以及重写开始的"起始符号".
我无法找出语法语法是什么.
我现在正在阅读SICP,并不真正理解5.5.6词典寻址中描述的词法寻址的必要性.
因为它说"因为我们的语言是词法范围的,所以任何表达式的运行时环境都会有一个与表达式出现的程序的词汇结构相似的结构",我认为在运行中搜索变量的成本是相同的 - 在编译环境中搜索的时间环境.为什么我们懒得实现编译环境?我认为编译环境将具有与程序的词法结构相同的结构,这与运行时环境相同,不是吗?
我对 JavaScript 中的作用域究竟是如何工作的(主要是词法作用域)感到有些困惑。我知道全局范围内的变量可以在任何地方访问,在 JavaScript 中创建新范围的唯一方法是通过创建函数(或在 ES6 中使用 let)。但是,我真的不明白词法范围是/意味着什么。我查遍了互联网,找不到明确的解释。
我觉得我有点开始理解它了,但让我向你们确认一下 JavaScript 向导,以确保我是正确的。
因此,根据我的理解,词法作用域意味着静态作用域,例如,函数的作用域不是由调用它的位置创建的,而是由创建函数本身的位置创建的。下面的代码演示了这个概念:
var x = "global";
function foo() {
console.log(x);
}
function bar() {
var x = "bar";
foo();
}
function baz() {
var x = "baz";
foo();
}
bar();
baz();
Run Code Online (Sandbox Code Playgroud)
打印到控制台的内容是“全局”两次。这是因为当函数 foo 被调用时,解释器首先检查 foo 的作用域,看它是否有变量“x”,然后检查全局作用域,而不是 bar 或 baz 作用域。变量“x”不是从函数 foo 被调用的地方获取的,而是从它被创建的地方获取的,因此是词法范围的。我是对的,这有意义吗?
词法作用域的另一个例子是闭包,对吧?例如,内部函数可以访问外部函数的变量,无论内部函数在哪里调用,因为词法作用域,对吗?
最后,我的最后一个例子是箭头函数。它们允许“this”的词汇范围,对吗?所以,例如,
var obj = {
name: "Rob",
print() {
setTimeout(() => {
console.log(this.name)
}, 1000);
}
};
Run Code Online (Sandbox Code Playgroud)
如果“this”是一个标准的内联函数,那么它不是绑定到全局对象,而是绑定到 obj 因为“this”的词法范围是箭头函数。
我说的都是对的吗?另外,有人能给我一个明确的词法范围定义吗?我应该了解 JavaScript 中的词法范围的任何其他示例吗?
谢谢。