2010-11-26 14 views
6

हास्केल का main फ़ंक्शन केवल वही करता है जो मैं चाहता हूं: जब फ़ाइल स्वयं लोड हो जाती है तो मूल्यांकन करें (उदा। ./myfile.hs या runhaskell myfile.hs) और किसी अन्य मामले में। main तब नहीं कहा जाएगा जब फ़ाइल किसी अन्य फ़ाइल द्वारा आयात की जाती है। newLISP में यह कार्यक्षमता भी है।हास्केल के मुख्य समारोह के बराबर आम लिस्प?

क्या सामान्य लिस्प के लिए समकक्ष कोड है?

मैंने सीएलआईएसपी के लिए source code पढ़ा।

  1. CLISP बचाता myfile.lispp->argv_execute_file के रूप में: यहाँ क्या होता है जब उपयोगकर्ता में प्रवेश करती है clisp myfile.lisp या ./myfile.lisp है।
  2. CLISP अभिव्यक्ति (LOAD "p->argv_execute_file") बनाता है और इसे लिस्प स्टैक पर धक्का देता है।
  3. सीएलआईएसपी किसी सूची में कोई अतिरिक्त कमांड लाइन तर्क बचाता है।
  4. CLISP लिस्प चर *args* में तर्क संग्रहीत करता है।

CLISP कभी नहीं एक लिस्प चर p->argv_execute_file की चर्चा करते हुए बनाता है, इसलिए विचार करने के लिए है कि क्या myfile.lisp सीधे लोड किया गया था, आरईपीएल में उपयोगकर्ता द्वारा कोई रास्ता नहीं, या किसी अन्य लिस्प फ़ाइल से होती है। यदि केवल (car *args*)myfile.lisp थे, तो मेरा कार्य आसान होगा।

नोट:

(set-dispatch-macro-character #\# #\! 
(lambda (stream character n) 
    (declare (ignore character n)) 
    (read-line stream nil nil t) 
    nil)) 
+0

आपको मुख्य कार्य के बराबर की आवश्यकता क्यों है? –

उत्तर

2

मुझे solution मिला। यह शेल चालबाजी का एक छोटा सा है, लेकिन यह काम करता है। मैं जल्द ही इसे सीएलआईएसपी के अलावा सीएल कार्यान्वयन पर काम करने के लिए संशोधित कर दूंगा।

#!/bin/sh 
#| 
exec clisp -q -q $0 $0 ${1+"[email protected]"} 
exit 
|# 

;;; Usage: ./scriptedmain.lisp 

(defun main (args) 
(format t "Hello World!~%") 
(quit)) 

;;; With help from Francois-Rene Rideau 
;;; http://tinyurl.com/cli-args 
(let ((args 
     #+clisp ext:*args* 
     #+sbcl sb-ext:*posix-argv* 
     #+clozure (ccl::command-line-arguments) 
     #+gcl si:*command-args* 
     #+ecl (loop for i from 0 below (si:argc) collect (si:argv i)) 
     #+cmu extensions:*command-line-strings* 
     #+allegro (sys:command-line-arguments) 
     #+lispworks sys:*line-arguments-list* 
    )) 

    (if (member (pathname-name *load-truename*) 
       args 
       :test #'(lambda (x y) (search x y :test #'equalp))) 
    (main args))) 
0

(eval-when (situation*) ...)

अद्यतन भ्रामक जवाब के लिए खेद है: Shebangs CLISP मुसीबत अगर फाइल आरईपीएल से भरी हुई है, इसलिए मैं ~/.clisprc.lisp में इस कोड डाल दे।

मैं गलत हो सकता था, लेकिन ऐसा करना असंभव प्रतीत होता है जो आप चाहते हैं। मैं एक शेल स्क्रिप्ट बनाउंगा और clisp -i myfile.lisp -x (main) पर कॉल करूंगा।

क्या इसे निष्पादन योग्य बनाने का कोई कारण नहीं है (वर्णित here)?

पीएस कॉमन लिस्प एक भाषा है और clisp कार्यान्वयन में से एक है।

+0

: कोड-संकलन केवल तभी काम करता है जब कोड संकलित हो रहा है और: फ़ाइल लोड होने पर मुख्य कॉल निष्पादित करें, वांछित कार्यक्षमता नहीं। – mcandre

+0

@mcandre ': लोड-टूप्लेवल 'फ़ाइल लोड होने पर काम करता है, लेकिन बाकी सब कुछ सही है, मैं जवाब अपडेट करने जा रहा हूं, धन्यवाद। – khachik

+0

clisp -i myscript.cl एक शेबांग के रूप में अच्छी तरह से काम नहीं करेगा। साथ ही, लिप एक स्क्रिप्ट लोड करते समय -x तर्कों की अनुमति नहीं देता है। लेकिन फिर भी धन्यवाद :) – mcandre

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