जेशेल स्क्रिप्ट के अंदर से, क्या कोड में परिभाषित वेरिएबल्स को एक्सेस या रजिस्टर करना संभव है जो जेएसएचएल भी बना रहे हैं?

वर्तमान में ऐसा लगता है कि शेल इंस्टेंस में एक चर को एक्सेस या पंजीकृत करने के लिए कोई तंत्र नहीं है, या जेएसएचएल (जैसे ऑब्जेक्ट्स या लैम्ब्डा इत्यादि) के अंदर से कोई भी स्ट्रिंग प्रकार नहीं लौटाता है।

भूतपूर्व:


    import jdk.jshell.JShell;
    import jdk.jshell.JShellException;
    import jdk.jshell.SnippetEvent;

    import java.util.List;


    public class Main {

        public static void main(String[] args) throws JShellException {
            var localVar = 1;
            JShell shell = JShell.create();
            // How to register localVar variable with shell instance or access variables from scope
            List events = shell.eval("var x = localVar;");
            SnippetEvent event = events.get(0);
            System.out.println("Kind: " + event.snippet().kind() + ", Value: " + event.value());
        }

    }

6
Developer 2 मार्च 2019, 00:54

1 उत्तर

सबसे बढ़िया उत्तर

जबकि आप अपने उदाहरण में स्थानीय नामों तक नहीं पहुंच सकते हैं, आप एक JShell इंस्टेंस बना सकते हैं जो उसी JVM में निष्पादित होता है जिसने इसे बनाया है। इसके लिए आप LocalExecutionControl. इस निष्पादन नियंत्रण का उपयोग करके आप localVar को अपनी Main कक्षा में एक स्थिर क्षेत्र में ले जा सकते हैं और फिर इसे Main.localVar के साथ JShell कोड के "अंदर" से एक्सेस कर सकते हैं।

दुर्भाग्य से चूंकि एपीआई को निष्पादन प्रदाताओं का समर्थन करने के लिए डिज़ाइन किया गया है जो एक अलग प्रक्रिया या एक अलग मशीन में भी हो सकते हैं, रिटर्न प्रकार एक स्ट्रिंग है। यदि आप एक हैक में रुचि रखते हैं, तो IJava ज्यूपिटर कर्नेल को eval के कार्यान्वयन की आवश्यकता है जो एक Object लौटाता है, जो DirectExecutionControl के आधार पर एक ExecutionControl कार्यान्वयन का उपयोग करके समाप्त होता है। eval कॉल के परिणाम को मानचित्र में संग्रहीत किया और उस परिणाम को संदर्भित करने के लिए एक अद्वितीय आईडी लौटा दी। फिर खोल का उपयोग करके आपको eval द्वारा लौटाई गई आईडी से परिणाम देखना होगा (कुछ ऐसा सोचें results.get(eval(sourceCode)))। वह कार्यान्वयन है > IJavaExecutionControl.java में github पर और IJavaExecutionControlProvider.java CodeEvaluator.java#L72 अगर आप इसमें से कोई (MIT लाइसेंस) लेने में रुचि रखते हैं।

3
SpencerPark 2 मार्च 2019, 21:34