标签: anonymous-function

Scala - 使用最小语法设计 DSL

我希望在 Scala 中设计一个 DSL,它的语法可能最少。它旨在供不了解 Scala 但可以利用 Scala 类型系统进行验证和错误检查的用户使用。在我的脑海中,DSL 是这样的:

outer {
    inner(id = "asdf") {
        value("v1")
        value("v2")
    }
}
Run Code Online (Sandbox Code Playgroud)

这个剪断应该产生一个这样的值:

Outer(Inner("asdf", Value("v1") :: Value("v2") :: Nil))
Run Code Online (Sandbox Code Playgroud)

给定数据结构

case class Outer(inner: Inner)
case class Inner(values: List[Value])
case class Value(value: String)
Run Code Online (Sandbox Code Playgroud)

这个想法是inner函数只在闭包之后可用outervalue函数只在闭包之后可用inner,等等。这就是以下不会编译:outer { value("1") }

我怎样才能实现这样的事情?最后,数据结构不需要是不可变的,只要它是强类型的,它就可以是任何东西。

我对 Scala 宏不熟悉,但我可以用宏来解决这个问题吗?


到目前为止,我最接近的是以下实现:

object DSL extends App {

    def outer = new Outer()

    class Outer(val values: mutable.MutableList[Inner] = mutable.MutableList.empty) {
        def inner(id: String): Inner = …
Run Code Online (Sandbox Code Playgroud)

dsl scala anonymous-function

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

纯函数中的模式匹配

我需要定义一个纯函数,它接受两个参数并返回它们的商。如果除数是0那么我想返回0

如果我有一个命名函数那么我会这样做

div[_, 0]   := 0
div[x_, y_] := x / y
Run Code Online (Sandbox Code Playgroud)

如何对纯函数中的参数进行相同类型的模式匹配#1 / #2 &

lambda wolfram-mathematica anonymous-function pattern-matching wolfram-language

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

Matlab匿名函数如果其他

在 MATLAB 中,我试图在元胞数组上执行一个函数,但运气不佳。我想创建一个cellfun检查是否str2double返回NaN值,然后str2double对不是的值执行的NaNs。我正在尝试使用带有 IF Else 类型语句的匿名函数,但实际上并没有得到任何结果。这是我到目前为止的想法:

x = cellfun(@(x)~isnan(str2double(x)),str2double(x))
Run Code Online (Sandbox Code Playgroud)

但是它不起作用,有人可以帮助我吗?

matlab lambda anonymous-function

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

OCaml 中的匿名递归函数

如何创建一个匿名递归函数(简单的函数,例如阶乘 n?)我听说这是可能的,但不知道如何使其在 OCaml 中工作。

let a =
  fun x -> ....
Run Code Online (Sandbox Code Playgroud)

我只是不知道如何继续下去...

recursion ocaml anonymous-function

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

此javascript工厂分配给的参数是什么?

我试图了解这种JavaScript模式是如何工作的,它是用括号括起来的整个库。我的理解是,括号是确定变量范围的一种方法,但是内部是一个采用参数(全局,工厂)的函数。

我尝试搜索此模式的工作原理,但找不到任何东西。

代码体返回一个可以在其他地方使用的对象,但是我不明白参数的目的globalfactory完成的目的。

我一直在阅读有关附件和匿名函数的信息,但是找不到关于这样定义的附件的任何信息。

(function (global, factory) {
    global.className = factory();
    }  (this, function () {
         ObjectName.prototype = function() {
             /* some code */
         }
         var data = {
              getUsefulData: function(obj) {
                   return new ObjectName(obj, 'usefuldata');
              }
         }
        return data;
    })
);
Run Code Online (Sandbox Code Playgroud)

问题:

  • 如果外部函数没有参数会怎样?
  • 此处为全局变量和变量分配了什么值?

javascript factory anonymous-function

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

如何将数组传递给匿名函数?

我目前在 Powershell 中使用匿名函数,我注意到从System.ValueTypeSystem.Object时存在奇怪的转换问题。

举个例子:

$f = {
    param($InputArray)
    Write-Host "`$Arr Type During Call:" ($InputArray.GetType().FullName)
    Write-Host "`$Arr Contents During Call:" $InputArray
}

[object[]]$Arr = [object[]]@($true, $false)

Write-Host "`$Arr Type Before Call:" ($Arr.GetType().FullName)
Write-Host "`$Arr Contents Before Call:" $Arr "`n"

$f.Invoke($Arr)
Run Code Online (Sandbox Code Playgroud)

以下示例将输出以下内容:

$Arr 调用前类型:System.Object[]
$Arr 调用前内容:True False

调用期间的 $Arr 类型:System.Boolean
调用期间的 $Arr 内容:True

看起来 Powershell 将我的变量转换$Arr为类型System.Boolean。如果我强制参数为 类型object[],则会引入一个新问题:

$f = {
    param([object[]]$InputArray)
    Write-Host "`$Arr Type During Call:" ($InputArray.GetType().FullName)
    Write-Host "`$Arr Contents During Call:" $InputArray …
Run Code Online (Sandbox Code Playgroud)

arrays powershell casting anonymous-function data-loss

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

PHP匿名函数里面没有这个

如何在没有这个的情况下在类中声明一个函数?

<?php

class modul {

    var $i=1;
    var $j=1;

    public function init(){
        $test1 = function($vRecord){
            return 'zwrot';
        };
        echo "<pre>";
        print_r($test1);
        echo "</pre>";
    }

}

$modul = new modul();
$modul->init();
Run Code Online (Sandbox Code Playgroud)

我打印时的结果:

Closure Object
(
    [this] => modul Object
        (
            [i] => 1
            [j] => 1
        )

    [parameter] => Array
        (
            [$vRecord] => 
        )

)
Run Code Online (Sandbox Code Playgroud)

如何在没有键的情况下传递函数:'this'?我想要一个纯函数 print_r 和这样的结果:

代码:

<?php
$test2 = function($vRecord){
    return 'zwrot';
};
echo "<pre>";
    print_r($test2);
echo "</pre>";
Run Code Online (Sandbox Code Playgroud)

我打印时的结果:

Closure Object
(
    [parameter] => Array
        (
            [$vRecord] => …
Run Code Online (Sandbox Code Playgroud)

php this anonymous-function

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

Ruby:隐式块转换为 Proc

我的理解是,必须生成一个隐式附加到方法的块;它不能被调用。所以我试图理解为什么会这样:

def execute_code
  proc.call
end

execute_code { "Why does this work?" } # => "Why does this work?"
Run Code Online (Sandbox Code Playgroud)

将块附加到此代码会成功执行。

任何见解?我没有发现任何文档暗示隐式块会自动转换为 proc 对象并分配给变量proc

红宝石 2.5.3

ruby anonymous-function proc

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

如何替换通用匿名函数?

假设有腿动物有一个特征:

trait Legged {
  val legs: Int

  def updateLegs(legs: Int): Legged
}
Run Code Online (Sandbox Code Playgroud)

有两种这样的有腿的动物:

case class Chicken(feathers: Int, legs: Int = 2) extends Legged {
  override def updateLegs(legs: Int): Legged = copy(legs = legs)
}

case class Dog(name: String, legs: Int = 4) extends Legged {
  override def updateLegs(legs: Int): Legged = copy(legs = legs)
}
Run Code Online (Sandbox Code Playgroud)

在农场里还有这些动物的持有人

case class Farm(chicken: Chicken, dog: Dog)
Run Code Online (Sandbox Code Playgroud)

以及一种通过添加一条额外的腿来变异所有有腿动物的通用方法

def mutate(legged: Legged): Legged = legged.updateLegs(legged.legs + 1)
Run Code Online (Sandbox Code Playgroud)

问题是如何在 上实现一个方法,Farm以便将mutate: Legged => Legged函数作为参数并将其应用于所有 …

scala anonymous-function function-signature

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

"所有方法"的C#委托或Func?

我已经阅读了有关Func和委托的内容,他们可以帮助您将方法作为参数传递.现在我有一个缓存服务,它有这个声明:

public static void AddToCache<T>(T model, double millisecs, string cacheId) where T : class
public static T GetFromCache<T>(string cacheId) where T : class
Run Code Online (Sandbox Code Playgroud)

所以在我想要缓存一些数据的地方,我检查它是否存在于缓存中(使用GetFromCache),如果不存在,则从某处获取数据,并将其添加到缓存中(使用AddToCache)

现在我想用一个参数扩展AddToCache方法,这是要调用以获取数据的类+方法然后声明就像这样

public static void AddToCache<T>(T model, double millisecs, string cacheId, Func/Delegate methode) where T : class
Run Code Online (Sandbox Code Playgroud)

然后这个方法可以检查缓存是否有数据,如果没有,则通过它提供的方法获取数据本身.

然后在调用代码中我可以说:

AddToCache<Person>(p, 10000, "Person", new PersonService().GetPersonById(1));
AddToCache<Advert>(a, 100000, "Advert", new AdvertService().GetAdverts(3));
Run Code Online (Sandbox Code Playgroud)

我想要实现的是'if cache is empty获取数据并添加到缓存'逻辑只放在一个地方.

我希望这是有道理的 :)

哦,顺便说一下,问题是:这可能吗?

.net c# asp.net generics anonymous-function

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