- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
有没有办法用 ABCL 创建一个 Java 类? (扩展另一个类)?
最佳答案
可以通过JVM包中的函数直接将Java类写成JVM字节码,这是ABCL自己的编译器使用的代码。从 abcl-0.25.0 开始,JAVA:JNEW-RUNTIME-CLASS method 有不受支持的代码它允许动态编写调用 Lisp 方法执行的 Java 类。代码使用来自 ObjectWeb 的类 ASM BCEL它必须存在于 JVM 类路径中。究竟需要哪个版本的 ASM BCEL 库,以及它是否适用于当前的 ABCL 尚未经过测试。 ABCL问题#153跟踪在当代 ABCL 实现中支持这一点所需的工作。
但是,如果有一个现有的 Java 接口(interface),并且想使用基于 Lisp 的方法来提供实现,则该过程要简单得多(并且受支持!)
相关函数是 JAVA:JINTERFACE-IMPLEMENTATION,其用法在 BankAccount example 中进行了演示。 .
对于Java接口(interface)定义为
public interface BankAccount {
public int getBalance();
public void deposit(int amount);
public void withdraw(int amount);
}
以下 Lisp 代码在当前 JVM 中创建了一个可用的 Java Proxy:
(defparameter *bank-account-impl*
(let ((balance 1000))
(jinterface-implementation
"BankAccount"
"getBalance"
(lambda ()
balance)
"deposit"
(lambda (amount)
(let ((amount (jobject-lisp-value amount)))
(setf balance (+ balance amount))))
"withdraw"
(lambda (amount)
(let ((amount (jobject-lisp-value amount)))
(setf balance (- balance amount)))))))
要从 Java 中获取对该实现的引用,可以使用 BankMainAccount.java 中的代码
...
org.armedbear.lisp.Package defaultPackage
= Packages.findPackage("CL-USER");
Symbol bankAccountImplSymbol
= defaultPackage.findAccessibleSymbol("*BANK-ACCOUNT-IMPL*");
LispObject value = bankAccountImplSymbol.symbolValue();
Object object = ((JavaObject) value).getObject();
BankAccount account = (BankAccount) object;
System.out.println("Initial balance: " + account.getBalance());
account.withdraw(500);
System.out.println("After withdrawing 500: " + account.getBalance());
...
关于java - 你能用 ABCL 写一个 Java 类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785969/
有谁知道如何(或是否)可以使用 ABCL 将 Lisp 代码编译为 .class 文件并创建一个 main 方法,以便将整个东西打包到 .jar 文件中并运行? 另外,有谁知道如何从 ABCL 代码访
我正在搜索 API 以使用 Java 在 JVM 中的 Common Lisp 语言的 Armed Bear Common Lisp (ABCL) 实现中处理值。 它在函数返回(仅)列表或字符串时有效
有没有办法用 ABCL 创建一个 Java 类? (扩展另一个类)? 最佳答案 可以通过JVM包中的函数直接将Java类写成JVM字节码,这是ABCL自己的编译器使用的代码。从 abcl-0.25.0
我刚刚开始查看 ABCL将一些 Lisp 混合到 Java 中。现在,从文件中加载一些 Lisp 就足够了,我一直在查看 examples .在每种情况下,模式都是: Interpreter inte
在 ABCL 中,在开发过程中,我有时会遇到失控的函数。我希望能够停止执行并返回到顶层 LISP,而不会终止 LISP/JVM 进程(在我的 emacs shell 中)和丢失我当前的 LISP 环境
关于我之前的问题, Executing a lisp function from Java我能够使用 ABCL 从 Java 调用 lisp 代码。但问题是,现有的 lisp 代码使用 CL-PPCR
如何在 ABCL 中产生一个后台(命名的)子进程/线程?也就是说,我想生成在后台运行的子进程(或线程),并将顶级评估留给其他处理。 使用 (apropos 'process/thread) 我发现了像
我是一名优秀的程序员,十分优秀!