在ERLANG:假设我们有一个函数f(),它将F1作为输入,其中F1是一个函数.有没有办法知道F1的输入参数的数量.
我觉得有一个解决方案,但我不确定.例如:
-module(high).
-compile(export_all).
f1() -> 1.
f2(X) -> X.
f3(X, Y) -> {X,Y}.
run(F) -> io:format("F ~p ~n", [F]).
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法让函数run/1知道有关传递函数的信息[主要是传递函数的输入参数的数量].
注意:请注意,这是一个理论问题.注意:应用程序的代码(有趣的,[参数])在开源中可用..这可能是我猜的.
问题如下,它可以在http://www.cs.indiana.edu/classes/b551-leak/scheme_practice.html中找到.
问题定义:编写一个函数cxr,它是Scheme中提供的car/cdr运算符的泛化.cxr应该取一串"a"和"d"表示要执行的car和cdr操作的序列,并返回一个能够执行该序列的函数.
因此(cxr"ad")相当于函数cadr.
((cxr "ad") '(i ii iii iv v vi vii)) ==> ii
(define sixth (cxr "addddd"))
(sixth '(i ii iii iv v vi vii)) ==> vi
Run Code Online (Sandbox Code Playgroud)
我的尝试:我使用string-append将cxr"ad"转换为字符串"cadr".[这很容易] ..现在我如何在"cadr"与cadr之间建立链接...我尝试了string->符号,但输出被引用,并且该函数从未被执行. - 那么有什么方法可以取消引用吗?!
真正的问题:如何解决这个问题?
更新:感谢所有人的回答.它们都是正确的,我甚至在发布问题之前就已经解决了这个问题.当输入是(cxr adddd)时,我主要是想找到一种实际调用caddddr的方法... Everbody和caddddr一样功能,但实际上并没有调用cadddr.
也就是说,如何使功能与cadr caddr等具有相同的命名类型.
更新:(我想我找到了解决方案,它如下 - 但正如下面所说,它不适用于更长的时间):
(define cxr
(lambda (ad l)
( (eval (string->symbol (string-append "c" ad "r"))) l)
)
)
Run Code Online (Sandbox Code Playgroud) 我们可以通过编写如下内容在 erlang 中创建一个嵌套列表:
NL = [[2,3], [1]].
[[2,3],[1]]
Run Code Online (Sandbox Code Playgroud)
但是假设我们是这样写的:
OL = [[2,3]|1].
[[2,3]|1]
Run Code Online (Sandbox Code Playgroud)
OL还是列表吗?有人可以详细说明OL是什么吗?