问题标签 [special-variables]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
lisp - 一般来说,“词汇和特殊变量”语义是如何在幕后实现的?
CLtL2 阐明了范围和范围之间的区别。对于词法变量和特殊变量,我的看法是,词法变量是“无限范围的词法范围”,而特殊变量是“无限范围的动态扩展”。</p>
我的问题是:“词法和特殊变量”语义一般是如何在幕后实现的?我所说的“一般”是指一个一般的想法就足够了。鉴于 Lisp 的悠久历史,必须有许多优化已应用于实现这些基本概念。
为了启动讨论,我在下面大胆猜测。
一切都从环境开始。环境是一系列帧,每个帧都是一个将名称映射到位置的表(可以检索和存储其值);每个这样的映射都是一个名字到一个地方的绑定。框架通过封闭关系链接;内部框架中的名称可以覆盖外部框架中的相同名称。此外,Common Lisp 中的绑定默认是词法的,除非declare
-d/ declaim
-ed/ proclaim
-ed 是特殊的。
语义有两个方面:名称查找和新绑定的创建。
创建一个新的绑定。
lambda
表达式、let
/let*
、labels
/flet
、macrolet
和使用它们的宏创建绑定。词法绑定是通过创建一个新框架并使当前词法环境成为新创建的框架的封闭环境来创建的。一个特殊的绑定(必须显式声明)将一个新位置推到为当前包中的名称创建的堆栈顶部(堆栈可以通过名称上的哈希表定位)——堆栈用于实现动态范围,以便在构造表单退出时,可以通过弹出堆栈来解构绑定(问题是如何确保如此,也许unwind-protect
在引擎盖下有类似的东西?)。名称查找。除非明确声明为特殊,否则名称查找默认为在词法环境中查找——通过在绑定创建期间建立的框架链接。查找过程中第一个匹配的名称获胜。对于特殊名称(必须明确声明),查找是通过查看堆栈顶部来提供的。
regex - perl 中有 $^I 的任何文档吗?
我$^I
在 perl 脚本中使用过有条件地搜索和替换。我想知道是$^I
在缓冲区中复制文件并在处理缓冲区后将整个缓冲区写回文件还是在行编辑中。
代码如下
perl - 如何获得已定义的 ${^OPEN}?
此代码需要进行哪些更改才能获得定义的 ${^OPEN}
?
macros - 宏展开下特殊变量的行为
我的宏观扩展心智模型(显然是错误的)说以下是按顺序发生的:
运行bot
( 绑定*foo*
到17
) 的宏扩展,运行 的宏扩展,打印(being )bar
的当前值,并返回不是宏的表单,宏扩展时间现在结束,最后评估表单,并返回*foo*
17
(+ 1 1)
(+ 1 1)
2
。
为什么我错了?
有没有一种简单的方法来做我想做的事?
regex - 如何在 Perl 中找到单个字符串的匹配正则表达式的位置?
假设my $string = "XXXXXTPXXXXTPXXXXTP";
我想匹配:$string =~ /TP/;
多次并返回每个位置,我该怎么做?
我试过了$-[0]
,$-[1]
但$-[2]
我只得到了一个职位$-[0]
。
编辑:我也尝试过全局修饰符//g
,但它仍然不起作用。
perl - 子例程中的 Perl 特殊变量“@_”不起作用
此脚本从下载的网页中提取 url。我在使用这个脚本时遇到了一些问题——当我使用"my $csv_html_line = @_ ;"
然后打印出来时"@html_LineArray"
——它只是打印出来"1's"
。当我用脚本替换时
"my $csv_html_line = @_ ;"
工作"my $csv_html_line = shift ;"
正常。我不知道两者之间有什么区别"= @_" and shift
-因为我认为在没有指定某些内容的情况下,在子例程中, shift shift froms"@_".
这是上面打印出来的。
这很好用 - 它使用班次而不是“@_”
ruby - __FILE__ == $PROGRAM_NAME 在红宝石中是什么意思?
在查看 Ruby 中的代码时,我偶然发现了这个 sintax。代码是:
我想__FILE__
是一个变量可以让我知道我所在的文件的名称吗?但那象征着什么$PROGRAM_NAME
呢?另外,为什么这个 if 语句是必要的,因为程序可以使用或不使用它?
bash - 迭代 $@ 的值
我想迭代给 bash 脚本的参数,例如:
$@
给了我所有给脚本的文件,但我如何迭代这些文件?
我想使用cat
每个文件并删除内容awk
(我知道该怎么做,这是解包$@
让我感到困惑)。
string - 在bash中的另一个变量中替换变量
这是我的示例 bash 代码:
这里的特殊变量$@
是指函数内部的另一个变量。我希望 echo $now 打印 command_1、command_2 等的内容。相反,它只是将输出打印为 command_1、command_2。
我尝试使用 eval 但我不确定如何设置 $i 部分的替换。我可以使用 if else 块来匹配函数内的每个变量,但这太笨拙了。有没有更好的办法?
bash - 为什么向 bash 脚本添加睡眠似乎会破坏某些命名变量的变量递减?
使用以下 bash 脚本:
我看到奇怪的行为。也就是说,如果我取消注释sleep 1
循环继续但计数器不递减,我会看到如下输出:
删除该行会产生预期的结果:
我不太确定为什么会这样。我可以将变量重命名为其他名称,并且事情按预期工作,所以似乎有些东西sleep
会破坏我的SECONDS
变量。
这很令人惊讶,为什么调用 sleep 会覆盖SECONDS
我脚本中的变量?