2010-05-17 14 views
19

यह मेरा समारोह है:क्या आप "if" कथन में एकाधिक कथन निष्पादित कर सकते हैं?

(defun MyFunction(input) 
    (let ((NEWNUM (find input num))) 
    (if (find input num)    //if this 
     (setq num NEWNUM) (FUNCT2)  //then execute both of these 
    (list 'not found))))    //else output this 

तो if बयान के बाद मैं एक नया चर एक समारोह सेट करें और फिर कॉल करने के लिए आदेश में (setq num NEWNUM)(FUNCT2) के बाद निष्पादित करने में सक्षम होना चाहता हूँ। इसे कैसे करना है इस पर कोई आइडिया?

+0

थोड़ा ऑफटॉप: ऐसा लगता है कि 'num' चर एक विशेष/गतिशील (यानी, वैश्विक) चर है। शायद आपको एक की आवश्यकता नहीं है। –

+0

कौन सा लिस्प बोलीभाषा इस कोड में लिखा गया है? –

उत्तर

33

अनुक्रम में कई चीजें करने के लिए, आप progn चाहते हैं। http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html

जब:

(defun MyFunction(input) 
    (let ((NEWNUM (find input num))) 
    (if (find input num)    //if this 
     (progn 
     (setq num NEWNUM) 
     (FUNCT2))  //then execute both of these 
    (list 'not found))))    //else output this 
+2

'प्रज्ञान' के बजाय आप 'prog1' का भी उपयोग कर सकते हैं, जो पहली अभिव्यक्ति के मूल्य को वापस कर देगा। – jcubic

12

जब आपके if, 'वन-आर्म्ड' है के रूप में वे इसे कहते हैं (अर्थात, यह कोई else शाखा शामिल हैं), यह आमतौर पर आसान और अधिक when और unless उपयोग करने के लिए मुहावरेदार है आप (when pred x y ... z) पर कॉल करते हैं, तो pred सत्य होने पर यह क्रमशः x y z का मूल्यांकन करेगा। unless इसी प्रकार व्यवहार करता है जब pred शून्य है। x y z एक ऊपर से किसी भी बयान का प्रतिनिधित्व कर सकते हैं। इस प्रकार:

(when pred (thunk)) 

सिर्फ एक ही रूप में

(if pred (thunk)) 

कुछ लोगों का कहना when और unless हमेशा के लिए स्पष्टता की वजह से 'एक-आर्म्ड-आईएफएस' का उपयोग किया जाना चाहिए।

संपादित करें: आपके धागे ने मुझे एक विचार दिया। इस मैक्रो:

(defmacro if/seq (cond then else) 
    `(if ,cond (progn ,@then) (progn ,@else))) 

इसे सक्षम करना चाहिए:

(if/seq (find input num)    //if this 
     ((setq num NEWNUM) (FUNCT2))  //then execute both of these 
    ((list 'not found))))) 

तो सामान्य प्रारूप है:

(if/seq *condition* (x y ... z) (a b ... c)) 

हालत के आधार पर यह पहली या दूसरी में subforms के सभी का मूल्यांकन करता है , लेकिन केवल अंतिम लौटाता है।

6

आप if के साथ कई बयानों उपयोग नहीं कर सकते, progn साथ के रूप में ऊपर पोस्ट को छोड़कर। लेकिन वहाँ cond रूप है,

(cond 
((find input num)  // if this 
    (setq num NEWNUM) // then execute both of these 
    (FUNCT2)) 

(t 
    (list 'not found))) // else output this 
1

बस को जोड़ने के लिए आप भी लिस्प क्रमिक रूप से में एक से अधिक अभिव्यक्ति का मूल्यांकन करने के (शुरू exp1 exp2 ...) सिंटैक्स का उपयोग कर सकते हैं। यदि किसी शाखा की शाखा पर इसका उपयोग कई कथनों का उपयोग करने के समान प्रभाव होगा।

+1

'शुरूआत' मुझे लगता है कि यह केवल योजना में है और उसके पास सामान्य लिस्प कोड है इसलिए उसे 'प्रोजेन' या 'प्रोग 1' का उपयोग करने की आवश्यकता है – jcubic

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