- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题与与所需 namespace 的静态或动态解析一起使用时需要的行为有关。
我将尝试表达我对事物的理解:
[1]与文字一起使用“require”
{ require MODULE; }
{
my $response = ::('MODULE'); # this happens at runtime
say $response.^name; # MODULE doesn't exist so the lookup results in the compilation-phase placeholder package: MODULE
try require MODULE; # although the execution order of require comes after the lookup,
# the placeholder package creation was done during compilation and the package is present in the current scope during run-time
}
{ try require 'FILE_PATH'; }
{ try require ::('MODULE'); }
{ modified_dynamic_lookup('MODULE') :if_symbol_not_found_search_repositories_and_if_appropriate_package_found_create_namespace_and_load_package_contents; }
file "foo.pm6" contents:
-----------------------------------
unit module foo;
class A is export {}
file "other.pm6" contents:
-----------------------------------
module foo {
class B is export {}
}
use lib <lib>;
my $name = 'other'; # select one of {'other', 'foo'}
require ::('foo') <A>; ########> Initial package loading
my $a = try ::('foo::A').new;
say '(1) ' ~ $a.^name; # (1) foo::A
$a = ::('A').new;
say '(2) ' ~ $a.^name; # (2) foo::A
try require ::($name); # if $name eq 'other' => throws exception, if $name eq 'foo' => does nothing
with $! {.say}; # P6M Merging GLOBAL symbols failed: duplicate definition of symbol foo ...
$a = try ::('foo::A').new;
say '(3) ' ~ $a.^name; # (3) foo::A
$a = ::('A').new;
say '(4) ' ~ $a.^name; # (4) foo::A
(1) foo::A
(2) foo::A
No such symbol 'other' ...
(3) Any
(4) foo::A
file "other.pm6" contents:
-----------------------------------
module foo {
class A is export {}
}
(1) foo::A
(2) foo::A
No such symbol 'other' ...
(3) foo::A
(4) foo::A
最佳答案
重写为与您的答案的the third version相对应。
[1]在文字上使用“require”
In this case the compiler checks to see if
MODULE
has already been declared as a symbol. If it hasn't, the compiler declares it, and binds it to an empty placeholder package it's just created for this "require"
require
关键字以及由它生成的代码4起作用。
require
不这样做,那么即使
require FOO
成功,使用标识符的代码也将无法编译:
require FOO;
my FOO $bar; # Type 'FOO' is not declared
# MODULE doesn't exist so the lookup results in the compilation-phase placeholder package: MODULE
MODULE
确实存在。并且查找成功。它返回绑定(bind)到
MODULE
符号的值,该符号是
require
在编译阶段放置在其中的占位符包。
# although the execution order of
require
comes after the lookup
require
的编译阶段操作的执行发生在运行阶段之前的查找之前。
If found (with appropriate content: modules, packages etc.) then it creates a namespace(s) in the current scope and loads it with the content(s) of the file.
require
的唯一声明是代码编写者已将其明确写为
require
语句的一部分的静态标识符的声明。例子:
require MODULE <A>;
-> MODULE
和A
。require 'MODULE.pm6' <A>;
-> A
。require ::('MODULE') <A>;
-> A
。require
不能完成这项工作。它由MLS代表其完成。而且它不是
require
所特有的。这是由于
use
语句在编译阶段进行的相同(某种工作)。
{ try require ::('MODULE'); }
我有一些代码试图证明在加载模块之前并没有进行查找。2
It seems to me that in that case "require" behaves NOT as a "normal" subroutine.
require
不是常规例程,否则不是常规例程。
say require MODULE; # Undeclared name:
MODULE used at line 1
# Undeclared routine:
require used at line 1
如果在
the official doc中搜索
require
,您会发现它未在
例程引用部分中列出,而是在
语言引用的模块部分中列出。它是关键字,语句,是编译器可以理解的语言的特殊部分。
If "require" behaves like a "normal" subroutine, then the only input it could use, would be the result of the dynamic lookup that followed it (Namespace or Failure).
Failure
:
my $variable = 42;
say ::('$variable'); # 42
say ::('nonsense') ~~ Failure; # True
$variable
不是命名空间。
But it is also a fact that in the case of a Failure (as the result of dynamic lookup), "require" continues searching the repositories for a proper package (as is normally the case, using nevertheless the argument we gave to dynamic lookup: 'MODULE').
require
还是MLS,任何代码都不会对其进行动态查找。
require
正在这样做(似乎不太可能,但我还没有准备100%消除它)。
{ modified_dynamic_lookup('MODULE') :if_symbol_not_found_search_repositories_and_if_appropriate_package_found_create_namespace_and_load_package_contents; }
我想我已经证明
require
或MLS根本没有查找任何内容,或者只有通过模块成功加载才可以进行查找。
what are the steps followed by the compiler at first and then by the runtime?
Actions.nqp
中的实际代码并不适合胆小的人!)
In that sense the "dynamic lookup construct" that follows the require "instruction" is used for 2 things:
To notify the compiler that the construct is "dynamic" (so don't bother fixing anything at compile time)
To provide the string that will be used to search for symbols, namespaces, files or repository content
when we load the same library "require" doesn't throw any exception. Is it silently ignoring the loaded library?
require
对此一无所知。它将其交给MLS,然后在MLS完成其任务后再接听。我认为
require
不能告诉您何时MLS成功执行了新的加载与何时仅跳过了加载之间的区别。它所知道的只是MLS说一切都好还是有异常(exception)。
Why bother doing so much work when it can check first that the same namespace is already in use?
require
仍然要调用MLS的情况下进行任何工作呢?做任何事情都是浪费精力。
require
要做的就是处理用户在
require
语句中明确键入的编译阶段符号。它不能要求MLS进行处理,因为它与成功的模块加载无关,而这是MLS摆弄符号的唯一情形。
In contrary when we pretend that we load a different library then it throws an Exception : "duplicate definition" of the symbol in use.
require ::('foo');
require ::('other');
现在,当您将
unit module foo;
和
foo.pm6
中的
other.pm6
更改为
unit module bar;
时,再试一次。您仍然会遇到相同的异常,但是符号将是
bar
。
require
如何知道
bar
?不可以异常来自MLS,并且该符号仅由MLS知道。
Therefore I conclude that maybe "require" checks first for a namespace that has the same name as the provided string.
require
的一部分,否则我相信您现在可以看到您的“也许”资格是明智的。 :)
I stumbled upon a strange behaviour ... The lookup of 'foo::A' in (3) doesn't find anything !!!
use
语句加载
foo.pm6
包。它定义了一个
foo
包,其中包含一个
A
类,并导出
A
。这会导致在导入的词法作用域
foo
中产生一个符号,该符号绑定(bind)到一个包,该包包含一个符号
A
。它还会在导入的词法范围内产生另一个符号
A
。
require
语句加载
other.pm6
包。它定义了一个
foo
包,其中包含一个
B
类,并导出
B
。这导致将导入词法作用域中的
foo
符号重新绑定(bind)到另一个包,即包含符号
B
的新包。它还会在导入的词法范围内产生另一个符号
B
。
A
徘徊。 (换句话说,P6M符号合并过程不包括删除符号。)但是在绑定(bind)到
foo::A
符号的包中查找的
foo
不再存在,因为绑定(bind)到
foo
符号的包现在是从
other.pm6
包,已覆盖了
foo.pm6
包中的一个。
try require ::($name);
with $! {.say}; # No such symbol 'other' ...
我认为这反射(reflect)了
require
在成功加载模块后执行了(失败的)查找。
require
才进行任何查找(如果那样;我仍然对这是MLS还是
require
并没有强烈的意识; code4对我来说太复杂了(atm)。
Its like we get as the result of the amalgamation of require + 'dynamic lookup formulation' an enhanced dynamic lookup like this
{ ::('something') :if_not_found_as_namespace_check_repositories_and_load }
foo
的
module foo { our sub bar is export { say 99 } }
软件包,如果
require
d可以成功加载。现在考虑以下代码:
my \foo = 42;
say ::('foo'); # 42
require ::('foo') <&bar>;
say foo; # 42
bar; # 99
这对我来说很有意义。它不会加载名称为
42
的软件包。它不会查找符号
foo
。它将加载名称为
foo
的软件包。尽管它可能会在加载程序包后查找
foo
符号,但由于已经存在一个符号,所以它不会安装
foo
符号。
require
的一部分,而只是被它调用。
my \MODULE =
{ my $v;
Proxy.new:
FETCH => method { say "get name: $v"; $v },
STORE => method ($n) { say "set name: $n"; $v = $n }}();
MODULE = 'unseen by `require`';
say ::('MODULE');
use lib '.';
say 'about to `require`';
require ::('MODULE');
Grammar.nqp
file开始:
rule statement_control:sym<require> {
<sym>
[
| <module_name>
| <file=.variable>
| <!sigil> <file=.term>
]
<EXPR>?
}
该代码似乎遵循了我们的期望-一个
require
关键字,后跟以下任意一个:
<module_name>
);或者<variable>
(例如$foo
);或者<term>
开头的<sigil>
。<module_name>
分支感兴趣。它调用
token module_name
,调用
token longname
,调用
token name
:
token name {
[
| <identifier> <morename>*
| <morename>+
]
}
显然,
::('foo')
并非以
<identifier>
开头。所以是
token morename
。我将删去一些没意思的行:
token morename {
'::'
[
|| <?before '(' | <.alpha> >
[
| <identifier>
| :dba('indirect name') '(' ~ ')' [ <.ws> <EXPR> ]
]
]?
}
答对了。这将匹配
::(
,尤其是
:dba('indirect name') '(' ~ ')' [ <.ws> <EXPR> ]
位。
statement_control:sym<require><module_name><longname><name><morename><EXPR>
不久之后,
statement_control:sym<require>
token 将成功。因此,这时它将在
Actions.nqp
中调用相应的action方法。
Actions.nqp
中,我们找到与
token statement_control:sym<require>
相对应的 Action ,即
method statement_control:sym<require>
。条件的开头
if $<module_name> {
将是
True
,从而导致运行此代码:
$longname := $*W.dissect_longname($<module_name><longname>);
$target_package := $longname.name_past;
在我看来,这段代码将剖析
::('foo')
的结果,并将与该剖析相对应的AST绑定(bind)到
$target_package
,而不是费心进行查找或准备运行时查找。
::('foo')
不必超过
require
可以解释的9个字符,但是它很可能会解释它们。这里没有必要的含义,因为它构造了程序包加载代码,因此它可以执行任何特定的操作,例如查找。
?? self.make_indirect_lookup($longname.components())
并赋予例程名称,我认为这是在进行查找,这可能是
require
尝试在成功加载软件包时添加软件包符号的一部分。
关于require - 需求行为(静态+动态)[RAKU],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62131486/
使用 ABC 加载模块 ( require )在分发的一个模块中工作,而在分发的另一个模块中失败。 加载 ABC 的原因可能是什么?与 require在一个地方失败? require Name::AB
我定义了以下方法: void Write(string fileContent, string fileName, string container = StorageBlobContainers.P
现在,Require.js是我最喜欢的Javascript编程方式。它可以使代码化整为零,并易于管理。而Require.js Optimizer能帮助我们将一个较大的应用分散成多个较小的应用,并通过
尝试开始使用 apioto http://apiato.io/A.getting-started/installation/ 如果我尝试测试 http://api.apiato.dev/registe
浏览 MDN 文档以查看提议的伪类的状态时,我遇到了 :required(并且扩展为 :optional)。这两个都已经存在很长时间了,但我现在才刚刚了解到。 此选择器与使用属性选择器 [requir
我正在尝试实现此条件:如果存在特定属性,则需要另一个属性;但如果它不存在,则不需要另一个。 另外,在 JSON 模式中,我们可以在依赖项中使用 not 吗? 这是一个示例架构 var schema =
我正在使用react-hot-loader我对其示例代码感到非常困惑: import React from 'react' import ReactDOM from 'react-dom' impor
过去几天我一直在玩 requirejs。我试图理解定义和要求之间的区别。 Define 似乎允许模块分离并允许遵守依赖关系顺序。但它会下载开始时所需的所有文件。而 require 仅在您需要时加载您需
我的项目是使用 angular cli [版本 - 6.1.3] 创建的。 我安装了 npm 模块 - is-reachable并在我的代码中使用它作为 - const isReachable = r
(有人可能会相应地更改标题)当像这样调用 javascript 的 require 方法时到底发生了什么: var xyz = require('xy')(require('z')); 谢谢 最佳答案
我一直在使用编译为 Node 代码的 Typescript 开发应用程序。因此,我更喜欢使用 import 语句来 require。 我一直在尝试将 Lodash 与 Lodash-Deep 一起使用
我在 require 中有一个奇怪的行为,我不知道如何避免(或者也许我的基础知识错误?)。 考虑以下代码: define (require) -> potoo = require "potoo"
这两种加杏仁和不加杏仁有什么区别? require('模块');require(['模块']); 编辑 嵌套: define(function() { require('module'); } def
我愿意使用 require.js 优化器优化我的 javascript 应用程序,但我现在想知道是否也可以在一个文件中包含 require.config 路径和 javascript 模块。事实上,在
我想我需要在一个页面中支持多个 require 实例,但在实现它时遇到了两个问题。我正在开发一项服务,该服务向外部客户端页面提供可嵌入的交互式对象。最重要的设计标准是易于嵌入,尽可能少地假设客户端环境
required 和 ng-required(表单验证)之间有什么区别? 最佳答案 AngularJS 表单元素查找 required属性来执行验证功能。 ng-required允许您设置requir
我有以下多选框: 0" /> 在我的 Controller 中,我在初始化时执行此操作: $scope.form.Slides = []; 如果幻灯片数组中有幻灯片,我希望表单的此元素有效。这些是动
我在 ubuntu 上运行 VPS: Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 C
我正在使用 ArcGIS API for Javascript 3.21。我在 require() 中有一个函数。我希望在单击按钮时调用该函数,但该按钮位于 require() 之外。
我的浏览器应用程序使用 require.js。该应用程序在屏幕上显示许多不同的小部件之一。 URL 片段包含小部件的路径(require.js 路径),然后调用 require 来动态加载它: var
我是一名优秀的程序员,十分优秀!