2011-01-24 9 views
5

क्या ABCL (जो कि किसी अन्य वर्ग का विस्तार करता है) के साथ जावा क्लास बनाने का कोई तरीका है?क्या आप एबीसीएल के साथ जावा क्लास लिख सकते हैं?

+1

यदि मैं पूछ सकता हूं तो एबीसीएल क्या है? –

+1

सशस्त्र भालू आम लिस्प। यह एक सामान्य लिस्प कार्यान्वयन है जो JVM पर चलता है। – compman

+0

यह वही नहीं है जो मैंने पूछा था, लेकिन यह वही करता है जो मैं करना चाहता हूं। [यह यूआरएल] (http://trac.common-lisp.net/armedbear/wiki/JavaScriptingAPI) में "जावा इंटरफेस का कार्यान्वयन" अनुभाग है। आप (जावा में) जावा ऑब्जेक्ट्स बना सकते हैं जो जावा इंटरफेस को कार्यान्वित करते हैं। – compman

उत्तर

5

कोई भी जावा क्लास को JVM पैकेज में कार्यों के माध्यम से सीधे JVM बाइटकोड के रूप में लिख सकता है, जो कोड एबीसीएल का स्वयं का कंपाइलर उपयोग करता है। Abcl-0.25.0 के रूप में, JAVA:JNEW-RUNTIME-CLASS method के लिए असमर्थित कोड है जो किसी को जावा क्लास को गतिशील रूप से लिखने की अनुमति देता है जो निष्पादन के लिए लिस्प विधि को कॉल करता है। कोड ऑब्जेक्टवेब ASM BCEL से कक्षाओं का उपयोग करता है जो JVM क्लासपाथ में मौजूद होना चाहिए। वास्तव में एएसएम बीसीईएल पुस्तकालय के किस संस्करण की आवश्यकता है, और क्या यह वर्तमान एबीसीएल के साथ काम करता है, यह अनचाहे है। एबीसीएल अंक #153 समकालीन एबीसीएल कार्यान्वयन में इसका समर्थन करने के लिए आवश्यक कार्य को ट्रैक करता है। JINTERFACE-कार्यान्वयन:

लेकिन अगर कोई एक मौजूदा जावा इंटरफेस है, जिसके लिए एक लिस्प आधारित विधियों का उपयोग करने के एक कार्यान्वयन प्रदान करना चाहते हैं नहीं है, इस प्रक्रिया काफी सरल है (! और समर्थित)

प्रासंगिक समारोह जावा है जिसका उपयोग BankAccount example में प्रदर्शित किया गया है।

जावा इंटरफ़ेस

public interface BankAccount { 
    public int getBalance(); 
    public void deposit(int amount); 
    public void withdraw(int amount); 
} 

निम्नलिखित लिस्प कोड के रूप में परिभाषित के लिए वर्तमान JVM में एक प्रयोग करने योग्य जावा प्रॉक्सी बनाता है:

(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))))))) 

जावा से कार्यान्वयन के लिए एक संदर्भ पाने के लिए, एक का उपयोग करता है 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()); 
    ... 
0

This example एबीसीएल में जावा इंटरफ़ेस को कार्यान्वित करने का तरीका दिखाता है।

संबंधित मुद्दे