我希望在 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函数只在闭包之后可用outer,value函数只在闭包之后可用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) 我需要定义一个纯函数,它接受两个参数并返回它们的商。如果除数是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
在 MATLAB 中,我试图在元胞数组上执行一个函数,但运气不佳。我想创建一个cellfun检查是否str2double返回NaN值,然后str2double对不是的值执行的NaNs。我正在尝试使用带有 IF Else 类型语句的匿名函数,但实际上并没有得到任何结果。这是我到目前为止的想法:
x = cellfun(@(x)~isnan(str2double(x)),str2double(x))
Run Code Online (Sandbox Code Playgroud)
但是它不起作用,有人可以帮助我吗?
如何创建一个匿名递归函数(简单的函数,例如阶乘 n?)我听说这是可能的,但不知道如何使其在 OCaml 中工作。
let a =
fun x -> ....
Run Code Online (Sandbox Code Playgroud)
我只是不知道如何继续下去...
我试图了解这种JavaScript模式是如何工作的,它是用括号括起来的整个库。我的理解是,括号是确定变量范围的一种方法,但是内部是一个采用参数(全局,工厂)的函数。
我尝试搜索此模式的工作原理,但找不到任何东西。
代码体返回一个可以在其他地方使用的对象,但是我不明白参数的目的global和factory完成的目的。
我一直在阅读有关附件和匿名函数的信息,但是找不到关于这样定义的附件的任何信息。
(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)
问题:
我目前在 Powershell 中使用匿名函数,我注意到从System.ValueType到System.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) 如何在没有这个的情况下在类中声明一个函数?
<?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) 我的理解是,必须生成一个隐式附加到方法的块;它不能被调用。所以我试图理解为什么会这样:
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
假设有腿动物有一个特征:
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函数作为参数并将其应用于所有 …
我已经阅读了有关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获取数据并添加到缓存'逻辑只放在一个地方.
我希望这是有道理的 :)
哦,顺便说一下,问题是:这可能吗?