是否有一个术语描述了一个函数,它不比没有参数的函数更简洁地采用任何参数?(例如,"高阶函数"意味着"将函数作为参数或返回函数的函数")
我自然会想到"无效",但当我看到"无效"时,我也会想到副作用.我正在考虑的情况是在以下讨论中找到的情况constantly:
你可以创建一个不带参数的闭包,没有副作用,但仍然做一些有趣的事情.
language-agnostic closures functional-programming nomenclature
最终编辑:它确实似乎是一个编译器错误 - 请参阅接受的答案.
在Excel 2007中使用VBA,我在'Class1'中有以下代码:
Option Explicit
Public Function strange(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
Public Sub not_strange(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Sub
Public Function also_not_strange(ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
Run Code Online (Sandbox Code Playgroud)
以及模块中的一些模式代码:
Option Explicit
Public Function not_strange_either(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
Public Sub outer(v)
Dim c As Class1
Set c = New Class1
Call c.strange("", v(LBound(v)))
Call c.not_strange("", v(LBound(v)))
Call c.also_not_strange(v(LBound(v)))
Call not_strange_either("", v(LBound(v)))
End Sub
Run Code Online (Sandbox Code Playgroud)
如果从立即窗口调用'outer',如下所示:
call outer(array("a"))
Run Code Online (Sandbox Code Playgroud)
我得到了看起来很奇怪的输出: …
我有这个VBA功能:
Public Function testPrec(target As Range) As String
testPrec = target.Precedents.Address(External:=False)
End Function
Run Code Online (Sandbox Code Playgroud)
在单元格C11中,我有这个公式:
=C6+C8
Run Code Online (Sandbox Code Playgroud)
如果我testPrec从即时窗口调用,它可以正常工作:
?testPrec([c11])
$C$6,$C$8
Run Code Online (Sandbox Code Playgroud)
编辑:如果从非UDF宏Sub调用它也可以正常工作.异常是UDF案例.
如果我从工作表中将其称为UDF:
=testPrec(C11)
Run Code Online (Sandbox Code Playgroud)
我刚回来"$ C $ 11".
有谁知道发生了什么,甚至更好地如何从UDF调用中获得实际的先例?(我正在使用Excel 2007.)
(我终于发布并接受了"不,没有,问题实际上并不是那么一般"的效果的答案.)
考虑Common Lisp函数'mapcar'.它接受一个函数和一些列表作为参数,并使用从每个列表中相同位置拉出的参数调用该函数.
标准库通常具有类似的函数,它采用单个列表,其中列表的每个元素都是函数的参数列表吗?什么是通常称为"标准"的功能?(这不是一个Lisp问题,但它是我知道的唯一功能语言+库.)
我想我在问一个像(在伪Lisp中)的操作:
(mapcar (curry #'apply function-to-map) list-of-arg-lists)
Run Code Online (Sandbox Code Playgroud)
已经有一个在多种语言或库中通用的名称(与'map'和'reduce'是常用操作的名称相同,而不仅仅是特定的库函数).
谢谢.
想象一个简单的(组成)语言,其中的函数如下所示:
function f(a, b) = c + 42
where c = a * b
Run Code Online (Sandbox Code Playgroud)
(说它是Lisp的一个子集,包括'defun'和'let'.)
还想象它包含看起来像的不可变对象:
struct s(a, b, c = a * b)
Run Code Online (Sandbox Code Playgroud)
再次类比于Lisp(这次是一个超集),假设像这样的结构定义将生成以下函数:
make-s(a, b)
s-a(s)
s-b(s)
s-c(s)
Run Code Online (Sandbox Code Playgroud)
现在,考虑到简单的设置,似乎很清楚,当您调用'f'或'make-s'时,幕后发生的事情之间存在很多相似之处.一旦在呼叫/实例化时间提供'a'和'b',就有足够的信息来计算'c'.
您可以考虑将struct实例化为类似于调用函数,然后存储生成的符号环境,以便在调用生成的访问器函数时供以后使用.或者您可以将一个函数评估为创建一个隐藏的结构,然后将其用作评估最终结果表达式的符号环境.
我的玩具模型是否过于简单,以至于没用?或者它实际上是一种有用的方式来思考真正的语言是如何工作的?是否有任何真正的语言/实现,没有CS背景但对编程语言感兴趣的人(即我)应该学习更多关于探索这个概念?
谢谢.
编辑:感谢您的答案到目前为止.为了详细说明,我想我想知道的是,如果有任何真正的语言,那么学习语言的人被告知例如"你应该认为对象基本上是闭包".或者,如果存在任何真正的语言实现,那么实例化对象并调用函数实际上共享一些常见的(非平凡的,即不仅仅是库调用)代码或数据结构.
我所做的类比,我知道其他人之前做过的,在任何实际情况下,是否比单纯的类比更深入?
我是 R 的新手,ggplot2而且相对较新。我可以在绘图上显示图片,并且可以使 y 轴反向缩放,但我不知道如何同时进行。例如:
library(ggplot2)
y=c(1,2,3)
x=c(0,0,0)
d=data.frame(x=x, y=y)
#following http://stackoverflow.com/questions/9917049/inserting-an-image-to-ggplot2/9917684#9917684
library(png)
library(grid)
img <- readPNG(system.file("img", "Rlogo.png", package="png"))
g <- rasterGrob(img, interpolate=TRUE)
#these work fine - either reversing scale, or adding custom annotation
ggplot(d, aes(x, y)) + geom_point()
ggplot(d, aes(x, y)) + geom_point() + scale_y_reverse()
ggplot(d, aes(x, y)) + geom_point() + annotation_custom(g, xmin=.23, xmax=.27, ymin=1.8, ymax=2.2)
#these don't...combining both reverse scale and custom annotation
ggplot(d, aes(x, y)) + geom_point() + annotation_custom(g, xmin=.23, xmax=.27, ymin=1.8, ymax=2.2) + scale_y_reverse() …Run Code Online (Sandbox Code Playgroud) 我做了大量的Excel VBA编程,但不是很多面向对象的.这是偶然出现的东西,这让我感到困扰,我想知道是否有一些我缺少的东西.
在VBA中,假设我有一个C类定义了一些私有成员,如下所示:
'...
Private hidden1_ As Double
Private hidden2_ As Double
'...
Run Code Online (Sandbox Code Playgroud)
如果VBA像C++或(大多数?)支持OOP的其他语言一样工作,我可以编写一个成员函数来在C类实例之间进行相等测试,如下所示:
'Error: won't compile!
Public Function equal(cinst As C) As Boolean
equal = (hidden1_ = cinst.hidden1_ And hidden2_ = cinst.hidden2_)
End Function
Run Code Online (Sandbox Code Playgroud)
当然,这不会在VBA中编译,因为类成员函数只能访问它们被调用的同一实例的私有类成员.我做过这种事情的最好的方法是改为定义两个成员函数,如下所示:
Public Function equalDef(hidden1 As Double, hidden2 As Double) As Boolean
equalDef = (hidden1_ = hidden1 And hidden2_ = hidden2)
End Function
Public Function equal(cinst As C) As Boolean
equal = cinst.equalDef(hidden1_, hidden2_)
End Function
Run Code Online (Sandbox Code Playgroud)
它很麻烦,它暴露了私有类成员存在的知识,但至少它避免实际暴露私有类成员的价值.
这是我能做的最好的吗?
编辑:
像往常一样,在回答之后,我意识到了一个更好的方式来表达这个问题.它的标题是"有没有更简洁的方法为私人成员的VBA类写一个平等测试?" 当迪克回答时.
对于给定的单元格,我选择数据/验证并将允许设置为"列表".我现在希望像这样设置Source:
= rNames(REGS)
但这不起作用(找不到名字).所以我去插入/名称/定义并通过简单地指定上面的公式创建"REGNAMES"(没有单元格范围).然后我返回数据/验证,当我像这样设置Source时:
= REGNAMES
现在我得到"Source当前评估为错误".不幸的是,即使忽略它,这个错误也不会消失.我可以在表格中创建一个范围公式,如下所示:
{= REGNAMES}
并将其拖到几个单元格的右侧,并忠实地返回rNames函数
选项#1 | 选项#2 | ...
也就是说,该函数返回预期的范围.
我知道我可以使用宏代码来操作VBA中该单元格的List设置.我不太喜欢这些副作用.我更喜欢一个基于函数的干净依赖树.任何想法如何让数据/验证接受从rNames返回的数组值?
谢谢.
PS:rNames将结果范围作为Variant返回,如果有任何影响的话.
我有一个3维阵列(5 x 5 x 3),我需要将(5 x 5 x 1)张贴到Sheet1,(5 x 5 x 2)到Sheet2,(5 x 5 x 3)到Sheet3.因为我在3个嵌套for循环中构建这个3维数组,所以我不能使用for循环来访问循环的(5 x 5)部分.是否有任何标识符告诉excel索引数组的所有元素,例如在MatLab中使用(1:end,1:end,1)?基本代码如下:
Sub practice_2()
Dim arr(1 To 5, 1 To 5, 1 To 3)
Dim a As Integer
Dim x As Integer
Dim y As Integer
For a = 1 To 3
For x = 1 To 5
For y = 1 To 5
arr(x, y, a) = x * y
Next
Next
Sheets(a).Select
'Following line is where I want to access the …Run Code Online (Sandbox Code Playgroud) 一些最有趣的每日WTF故事以私人语言为主.但是,特定于域的语言可能非常强大,并且似乎越来越受欢迎.当然,如果没有优秀的图书馆,我们就无法编程,但正如谚语所说,"图书馆设计就是语言设计".
没有人喜欢糟糕的API,但只是其中一个程度,或者WTF是一个完全不同的物种?显然这是主观的,所以我把它作为一个社区维基帖.(Stackoverflow联合创始人对一种特定的内部语言是否甚至是WTF有着不同的看法.)
我自己的预感是,这是一种普遍性的尝试,使WTF出现,但我想看看其他人的想法.
(这个问题是通过阅读JaredPar对这个问题的答案的评论引发的:https://stackoverflow.com/questions/901320/anti-joel-test/901361#901361)
(为了澄清一点,"私人语言"一词通常用于负面内涵,而"DSL"或"图书馆"则是中立的.如果有的话,"内部"工具在前往被嘲笑为一种可怕的"私人语言"除了可能使它成为一种坏工具的常见事物之外?这不一定是一种语言;它可能是一个图书馆或框架.)
最终编辑:我接受了罗杰佩特的回答:"实质上是什么?没有." 因为我觉得这个问题实际上是正确的.我想强调Aaronaught关于DSL的答案,因为我觉得它特别好.谢谢.
编辑:我的问题是,原本"有没有一个标准名称,以展名单列表的功能,但只有一层深?",但查克的回答是措辞更接近我其实是想问问,所以我给它改名.不过,这三个答案对我都很有用.谢谢.
"扁平化"似乎是这需要一棵树,但是建立原子组成的列表深它们嵌套,但对于只有一个级别之后停止功能的功能广为接受的名字吗?所以((1 2)((3 4)(5 6))(7 8))"somethings"到(1 2(3 4)(5 6)7 8)."某些东西"在多种语言/库中是否有共同的名称?
这个问题的答案:
建议'链'可能是一个很好的猜测,但它是否足以成为"标准"?
vba ×5
excel ×4
lisp ×2
list ×2
naming ×2
api ×1
closures ×1
compiler-bug ×1
dsl ×1
excel-2007 ×1
excel-vba ×1
frameworks ×1
ggplot2 ×1
immutability ×1
map ×1
nomenclature ×1
oop ×1
r ×1