2016-08-23 10 views
6

में कस्टम '+' (योग) फ़ंक्शन मैं पॉल ग्राहम द्वारा लिस्प के रूट्स पढ़ रहा था, जहां उनका दावा है कि किसी भी लिस्पी कार्यक्षमता को इस 7 मूल कार्यों के संयोजन के साथ बनाया जा सकता है: उद्धरण, परमाणु, ईक, कंड, विपक्ष , कार, सीडीआर।लिस्प

प्रश्न: क्या लिस्प बोलीयां वास्तव में उन कार्यों पर आधारित हैं? उपर्युक्त 7 आदिम कार्यों का उपयोग करके हम 'योग' या 'प्लस' फ़ंक्शन को कैसे परिभाषित कर सकते हैं? जैसे हमारा अपना (+ 1 2) फ़ंक्शन

नोट: मैं लिस्प के लिए पूरी तरह से नौसिखिया हूं लेकिन मैं भी भाषा के बारे में बहुत उत्साहित होना शुरू कर रहा हूं। इस सवाल का उद्देश्य पूरी तरह से वास्तविक ब्याज

+0

उन सात कार्यों के साथ लिस्प में कोई संख्या नहीं है। कोई 1 और नहीं 2 है। इस प्रकार (प्लस 1 2) काम नहीं करेगा। –

+2

यह 1 है: '(())'। और यह 2 है: '(()())'। –

उत्तर

12

लेखक 1 9 60 में ट्यूरिंग अवॉर्ड और लिस्प आविष्कारक जॉन मैककार्थी “Recursive Functions of Symbolic Expressions and Their Computation by Machine” द्वारा लिखे गए एक बहुत ही प्रसिद्ध पेपर को संदर्भित करता है, जिसमें उन्होंने लिस्प के अर्थशास्त्र को एक नए कम्प्यूटेशनल औपचारिकता के रूप में परिभाषित किया है, समकक्ष ट्यूरिंग मशीन के लिए शक्ति में।

पेपर में (और Lisp 1.5 Manual में) मैककार्थी ने भाषा के लिए दुभाषिया का वर्णन किया, जिसे ग्राहम द्वारा वर्णित केवल सात प्राचीन कार्यों का उपयोग करके पूरी तरह से लिखा जा सकता है।

भाषा मुख्य रूप से प्रतीकात्मक गणनाओं के लिए समर्पित थी, और केवल उन गणनाओं से संबंधित दुभाषिया प्रस्तुत किए गए थे, संख्याओं या अन्य डेटा प्रकारों का उपयोग किए बिना परमाणुओं और जोड़ों से अलग।

जैसा कि ग्राहम लिस्प के रूट के पेज 11 पर एक नोट में कहते हैं, "मैककार्थी के 1 9 60 लिस्प में अंकगणित करना संभव है। n परमाणुओं की सूची n "का प्रतिनिधित्व करने के लिए एक सूची है, इसलिए योग करना दो सूचियों को जोड़ने के बराबर है।

बेशक ऐसा करने का तरीका बहुत अक्षम है: इसे केवल अन्य कम्प्यूटेशनल औपचारिकताओं के साथ समानता दिखाने के लिए प्रस्तुत किया जाता है, और वास्तविक दुभाषियों/कंपाइलर्स पूर्णांक में सामान्य रूप से प्रतिनिधित्व किया जाता है, और सामान्य ऑपरेटर होते हैं।

+0

लिस्प 1.5 में संख्याएं थीं। पृष्ठ 24 देखें (पीडीएफ में 32) – Sylwester

+0

@ सिलवेस्टर, आप सही हैं। मैं धारा 1.6 "एक सार्वभौमिक LISP फ़ंक्शन" (पीडीएफ के पेज 10-14) का जिक्र कर रहा था, जहां इसे लिस्प के "सार्वभौमिक कार्य" को परिभाषित किया गया है, जो मेटाइंटरप्रेटर है, संख्याओं के संदर्भ के बिना, जिसे बाद में पेश किया गया है , "वास्तविक" भाषा में। – Renzo

3

जहां तक ​​मुझे याद है, सूची घोंसला स्तर (वास्तव में याद नहीं है, कहां) का उपयोग करके ऐसा करने का एक दृष्टिकोण भी था। () से शून्य के रूप में, (()) == 1 और इसी तरह से शुरू हो रहा है। तो फिर तुम बस list रूप inc परिभाषित कर सकते हैं और dec रूप car:

CL-USER> (defun zero? (x) (eq() x)) 
ZERO? 

CL-USER> (zero? nil) 
T 

CL-USER> (zero? 1) 
NIL 

CL-USER> (defparameter *zero*()) 
*ZERO* 

CL-USER> (defun inc (x) (list x)) 
INC 

CL-USER> (defun dec (x) (car x)) 
DEC 

CL-USER> (defun plus (x y) 
      (if (zero? y) x (plus (inc x) (dec y)))) 
PLUS 

CL-USER> (plus *zero* (inc (inc *zero*))) 
((NIL)) 

CL-USER> (defparameter *one* (inc *zero*)) 
*ONE* 

CL-USER> (defparameter *two* (inc *one*)) 
*TWO* 

CL-USER> (defparameter *three* (inc *two*)) 
*THREE* 

CL-USER> (plus *two* *three*) 
(((((NIL))))) 

CL-USER> (equal *two* (dec (dec (dec (plus *two* *three*))))) 
T 
3

टी एल; डीआर: नहीं। आधुनिक लिस्प प्रणालियों में पहले लिस्प की तुलना में कई अधिक प्राइमेटिव हैं और प्रत्येक नए आदिम डेटा प्रकार के लिए एक नए प्राइमेटिव की आवश्यकता है।

पहले लिस्प में संख्याएं नहीं थीं लेकिन यह पूर्ण हो रही थी। इसका मतलब है कि यह किसी भी अन्य भाषा में संभव है कि गणना कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि ऐसा करना व्यावहारिक होगा। नकल करने के लिए संख्या मुश्किल नहीं थी, लेकिन गणना धीमी थी। आज धीमी अंकगणित डेटिंग पूर्व लिस्प 1.5 के बारे में अफवाहें हैं।

जब मैंने अपना पहला लिस्पी दुभाषिया बनाया तो मैं संख्याओं के लिए ज्यादा परवाह नहीं कर सका। यह वास्तव में एक दुभाषिया का एक दिलचस्प पहलू नहीं है। मैं फिर भी एक उदाहरण के रूप fibonacci को लागू किया था और यह कि यह कैसा दिखता है जैसे:

;; This is NOT Common Lisp code. It's Zozotez 
(setq + (lambda (x y) 
    (if x (cons (car x) 
       (+ (cdr x) y)) 
     y))) 

(setq - (lambda (z w) 
    (if w (- (cdr z) 
      (cdr w)) 
     z))) 

(setq fibonacci 
    (lambda (n a1 a2) 
    (if n 
     (fibonacci (- n '(1)) 
        a2 
        (+ a2 a1)) 
     a1))) 

(fibonacci '(1 1 1 1 1 1 1 1 1)() '(1)) 
; ==> (1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) 

कोई नंबर नहीं!(1 मेरी भाषा में एक प्रतीक है इसलिए इसे उद्धृत करने की आवश्यकता है या अन्यथा इसे एक चर की तरह मूल्यांकन किया जाएगा)

वैकल्पिक संख्या प्रणाली के रूप में मैंने एक स्थितित्मक प्रणाली लागू की है, जैसा कि हम एक ही नियम के साथ संख्याएं लिखते हैं जोड़ने/गुणा करने के लिए इत्यादि। शायद लंबाई की लेट्स की तुलना में तेज़ एक तेज़ है लेकिन अधिक जटिल बनाना है।

यदि लिस्प बंद हो गया है तो आप चर्च अंकों को कर सकते हैं। लैम्ब्डा कैलकुस के समान उपयोग करके आप केवल बंद होने के साथ कुछ भी गणना कर सकते हैं। आपको केवल एक आदिम, lambda की आवश्यकता है। (फिर से, काम करने के लिए सबसे आसान नहीं)