标签: lexical-scope

如何在C++中使用lambda作为词法范围

代码是这样的:

int a = 1;
auto f = [a] {return a;};
a = 100;
std::cout << f() << endl;
return 0;
Run Code Online (Sandbox Code Playgroud)

我希望看到100结果.然而,a就像在被捕时被冻结一样f.结果是1.变化a时有没有办法保持一致a

c++ lambda functional-programming function lexical-scope

2
推荐指数
1
解决办法
527
查看次数

你能否启用R函数来评估自己的形式值?

在R语言中,假设我有一个函数ff(jj,kk,mm).我希望调用函数(或调用人在交互式会话中)能够在调用时使jj和kk以任意方式取决于mm.

具体而言,假设:

ff <- function(jj, kk, mm){
  xx <- jj + kk  
  out<- xx/mm   
  out
}
Run Code Online (Sandbox Code Playgroud)

然后在运行时,我想设置mm <- jj*kk.即:

ff(2, 3, (jj*kk))
Run Code Online (Sandbox Code Playgroud)

这会产生:

Error in ff(2, 3, (jj * kk)) : object 'jj' not found
Run Code Online (Sandbox Code Playgroud)

mm在评估之前,即在成功评估之后jj,不会抛出此错误kk.因此,他们将使用不同的范围规则进行第二次评估.我知道这是R标准范围.我问,我可以用这样的方式编写函数,它允许我递给一个简单的数字,或者其他形式参数的函数,只要这些参数在mm需要之前已经或者可以被评估了 吗?

请注意,我不是在问我是否应该这样做.对于后一个问题提出意见的人,我会坚决地假装礼貌.

我也不会问我是否可以预先计算jj并预先计算出预先消化的数字.我知道这是一个看似合理的答案,但由于我已经简化了问题,它不起作用.

arguments r dynamic scoping lexical-scope

2
推荐指数
1
解决办法
52
查看次数

使用我们和BEGIN块交互声明的变量

在这种情况下,为什么未初始化的变量的行为/交互方式与初始化变量不同:

use strict;
use warnings;

our($foo) = 0;
BEGIN {
        $foo = 2;
}

our($bar);
BEGIN {
        $bar = 3;
}

print "FOO: <$foo>\n";
print "BAR: <$bar>\n";
Run Code Online (Sandbox Code Playgroud)

结果是:

$ perl test.pl
FOO: <0>
BAR: <3>
Run Code Online (Sandbox Code Playgroud)

Perl版本:

$ perl -v

This is perl 5, version 22, subversion 0 (v5.22.0) built for x86_64-linux
Run Code Online (Sandbox Code Playgroud)

perl scoping lexical-scope

2
推荐指数
1
解决办法
105
查看次数

你能解释一下这个LISP函数以及为什么问题出现在动态范围内吗?

在阅读一些lisp历史时,从LISP 1到LISP 1.5,我遇到了这个功能:

(define (testr x p f u)
  (if (p x)
      (f x)
      (if (atom? x)
          (u)
          (testr (cdr x)
                 p
                 f
                 (lambda ()
                   (testr (car x) p f u))))))
Run Code Online (Sandbox Code Playgroud)

麦卡锡认为,"困难在于当内部递归发生时,car [x]所需的值是外部值,但实际使用了内部值.在现代术语中,需要词法范围,并获得动态范围. ".

我无法弄清楚他所指的是什么"外部价值"和"内在价值",也无法看到在使用动态范围进行评估时这个函数是如何行为不当的.我能理解lambda是否有些阴影'x',但它是零参数的函数.

(实际上很难找到这个功能,因为它似乎从网页本身中遗漏了.只是在浏览了images.tex文件之后:http://www-formal.stanford.edu/jmc/history/lisp /images.tex,我发现它).

lisp scoping dynamic-scope lexical-scope

2
推荐指数
1
解决办法
63
查看次数

为什么 Dart 程序的行为会根据使用词法作用域时声明变量的位置而有所不同?

今天我遇到了 Dart 看起来非常奇怪的行为。我对局部变量和词法作用域的理解一定有问题。让我们来看一些代码。上下文是从数字到字母的测试等级转换,但这对于理解并不重要。

首先,考虑这段代码,它按预期工作:

void main() {
  final pairs = <List>[
    [95, 'A'],
    [85, 'B'],
  ];

  for (final pair in pairs) {
    int number = pair[0];
    String letter = pair[1];
    test('$number converts to $letter', () {
      final actual = convert(number);
      expect(actual, letter);
    });
  }
}

String convert(int value) => value >= 90 ? 'A' : 'B';
Run Code Online (Sandbox Code Playgroud)

运行测试并通过。将第二行测试数据从85改为95,第二次测试失败。我明白这一点。

现在考虑这个替代实现。请注意,唯一的区别是numberletter变量现在是在for循环外部声明的。

void main() {
  final pairs = <List>[
    [95, 'A'],
    [85, 'B'],
  ];

  int number;
  String letter; …
Run Code Online (Sandbox Code Playgroud)

lexical-scope dart

2
推荐指数
1
解决办法
38
查看次数

C:不能在if语句中声明指针

我有一个指向函数的指针.我想要:

  if (mode == 0)
  {
  const unsigned char *packet = read_serial_packet(src, &len);

  } else {
  const unsigned char *packet = read_network_packet(fd, &len);
  }
Run Code Online (Sandbox Code Playgroud)

但我不能这样做,因为我的编译器在我稍后在代码中使用指针时会抱怨.

   error: 'packet' undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

这很奇怪.它没有if语句,但现在我需要我的程序能够从不同的来源获取数据.这样做不可能吗?我认同.如果不是,还有其他简单的方法来获得我正在尝试的东西吗?

非常感谢.

c conditional lexical-scope

1
推荐指数
3
解决办法
3162
查看次数

lambda中的alpha转换

为什么C#不支持alpha转换?

int n = 3;
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);
Console.Out.WriteLine("N value = " + n);
Run Code Online (Sandbox Code Playgroud)

产量:

名为'n'的局部变量不能在此范围内声明,因为它会给'n'赋予不同的含义,'n'已在'父或当前'范围内用于表示其他内容

有没有我不知道的颗粒原因,因为它听起来很傻?

c# lambda programming-languages lexical-scope

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

词法设置功能符号

我正在寻找一种方便的方法,暂时交换功能.我知道我可以像这样手动设置一个功能符号:

CL-USER> (setf (symbol-function 'abcd) #'+)
#<FUNCTION +>
CL-USER> (abcd 1 2 4)
7
Run Code Online (Sandbox Code Playgroud)

我也知道labels或者flet可以临时为已定义的函数设置名称:

CL-USER> (labels ((abcd (&rest x) 
                    (apply #'* x)))
            (abcd 1 2 4))
8
Run Code Online (Sandbox Code Playgroud)

有没有办法手动,词法设置功能名称?例如.:

CL-USER> (some-variant-of-labels-or-let ((abcd #'*))
            (abcd 1 2 4))
8
Run Code Online (Sandbox Code Playgroud)

注意:我尝试进入标签和flet的来源,但两者都是特殊的运算符.没有快乐.

common-lisp lexical-scope

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

scipy-为什么COBYLA不遵守约束?

我正在使用COBYLA对具有约束的线性目标函数进行成本最小化。我正在通过为每个限制都包含一个约束来实现上下限。

import numpy as np
import scipy.optimize

def linear_cost(factor_prices):
    def cost_fn(x):
        return np.dot(factor_prices, x)
    return cost_fn


def cobb_douglas(factor_elasticities):
    def tech_fn(x):
        return np.product(np.power(x, factor_elasticities), axis=1)
    return tech_fn

def mincost(targets, cost_fn, tech_fn, bounds):

    n = len(bounds)
    m = len(targets)

    x0 = np.ones(n)  # Do not use np.zeros.

    cons = []

    for factor in range(n):
        lower, upper = bounds[factor]
        l = {'type': 'ineq',
             'fun': lambda x: x[factor] - lower}
        u = {'type': 'ineq',
             'fun': lambda x: upper - x[factor]}
        cons.append(l)
        cons.append(u)

    for output …
Run Code Online (Sandbox Code Playgroud)

scipy lexical-scope

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

我们在哪里可以使用Go中的变量范围和阴影?

我找到的一些相关帖子:

还有许多用于变量范围和阴影的用例.
任何代码示例或答案将不胜感激.

scope go shadowing lexical-scope

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

javascript函数中的词法范围

以下片段:

a = 0;

function f1() {
    a = 1;
    f2();
}

function f2() {
    return a;
}

f1();
Run Code Online (Sandbox Code Playgroud)

返回undefined.

根据我的理解,函数在定义变量时可以访问变量,并在执行变量时访问这些变量的值.因此,在这种情况下,我会猜到f2可以访问全局变量'a',并读取它的修改值(1).那为什么它未定义?

javascript closures scope lexical-scope

0
推荐指数
1
解决办法
115
查看次数

"设置"功能

我很难理解一些具有更多经验的人可能理解的代码的工作原理:

(let ((x 0))
  (loop for var in '(x)
    do (set var 3))
  x)
Run Code Online (Sandbox Code Playgroud)

我的期望是表达式应该返回3,x的新值,但它实际上返回0.为什么x没有被重置?是否有另一种方法来迭代变量列表并为它们赋值?

common-lisp dynamic-binding lexical-scope

0
推荐指数
1
解决办法
72
查看次数

Go中明确作用域块的目的?

我正在MicroMDM SCEP存储库https://github.com/micromdm/scep/blob/1e0c4b782f3f2e1e6f81da5f82444a6cedc89df3/cmd/scepclient/scepclient.go#L54-L65中阅读此源代码:

func run(cfg runCfg) error {
    ctx := context.Background()
    var logger log.Logger
    {
        if strings.ToLower(cfg.logfmt) == "json" {
            logger = log.NewJSONLogger(os.Stderr)
        } else {
            logger = log.NewLogfmtLogger(os.Stderr)
        }
        stdlog.SetOutput(log.NewStdlibAdapter(logger))
        logger = log.With(logger, "ts", log.DefaultTimestampUTC)
        if !cfg.debug {
            logger = level.NewFilter(logger, level.AllowInfo())
        }
    }
    lginfo := level.Info(logger)
Run Code Online (Sandbox Code Playgroud)

我想知道显式块(外部{ ... })的目的是什么?此代码与删除时的代码是否完全相同,例如

func run(cfg runCfg) error {
    ctx := context.Background()
    var logger log.Logger
    if strings.ToLower(cfg.logfmt) == "json" {
        logger = log.NewJSONLogger(os.Stderr)
    } else {
        logger = log.NewLogfmtLogger(os.Stderr)
    } …
Run Code Online (Sandbox Code Playgroud)

go lexical-scope

-1
推荐指数
1
解决办法
55
查看次数