我正在尝试编写一个多行函数以在 OCaml REPL 中使用。我已经看过这个问题,但是在 REPL 中使用它时建议的语法似乎不起作用。
要使用一个人为的示例,我无法编译以下内容:
let theFun: int -> int = fun x ->
let foo = x;
foo;;
Run Code Online (Sandbox Code Playgroud)
当我输入没有“;;”的时候 在此在线 REPL中,它们无论如何都会被添加,这给了我一个语法错误。当我在本地计算机上使用 REPL 时,除非包含“;;”,否则不会对输入进行求值,这也会导致语法错误。
我正在尝试使用标签的本地函数来允许我的函数递归.这是代码:
(defun my-replace (e1 e2 L)
"Perform a deep replace e1 with e2 in L."
(labels ((my-replace-rec (e1 e2 L)
"Used for recursion"
(cond ((endp L) nil)
((equal (car L) e1) (cons e2 (cdr L)))
((listp (car L)) (my-replace-rec e1 e2 (car L)))
(t (my-replace-rec e1 e2 (cdr L)))))))
(my-replace-rec e1 e2 L))
Run Code Online (Sandbox Code Playgroud)
当我有slime评估函数并尝试运行它:
; Note: Deleting unused function
; (LABELS MY-REPLACE-REC)
; ;
; Warning: This function is undefined:
; MY-REPLACE-REC
Run Code Online (Sandbox Code Playgroud)
我试图尽可能多地填写错误消息,但我正在使用Emacs(我还是很新),并尝试粘贴一个小缓冲区.
为什么会这样?它被定义和使用,但它似乎在使用之前被删除(据说因为它没有被使用).
我本质上是在问与这个老问题相同的问题,但针对的是 Java 14 而不是 Java 8。为了避免回答者导航到老问题的麻烦,我将在这里重新表述。我想从引用的方法中获取函数的名称。下面的 Java 代码应该能让您明白:
public class Main
{
public static void main(String[] args)
{
printMethodName(Main::main);
}
private static void printMethodName(Consumer<String[]> theFunc)
{
String funcName = // somehow get name from theFunc
System.out.println(funcName)
}
}
Run Code Online (Sandbox Code Playgroud)
C# 中的等效内容是:
public class Main
{
public static void Main()
{
var method = Main.Main;
PrintMethodName(method)
}
private static void PrintMethodName(Action action)
{
Console.WriteLine(action.GetMethodInfo().Name);
}
}
Run Code Online (Sandbox Code Playgroud)
根据老问题的公认答案,如果没有大量的工作,这在 Java 8 中是不可能的,例如这个解决方案。Java 14中有更优雅的解决方案吗?