क्या एक मैक्रो को परिभाषित करना संभव है जिसका रैकेट में फ़ंक्शन के समान नाम है, लेकिन इसे ओवरराइड नहीं करना है। (ताकि पारित तर्क के आधार पर उस नाम के 2 संभावित उपयोग होंगे)

उदाहरण के लिए दौर फ़ंक्शन करें।

1. उपयोग (रैकेट समारोह)

( round 1.2 )
-> 1

२. उपयोग (हमारा मैक्रो)

(round (someStruct arg)) 
-> resultStruct
0
sadsad 27 पद 2019, 15:04

1 उत्तर

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

फ़ंक्शन का उपयोग करना

(require (only-in racket [round @round]))
(define (my-round v)
  ;; do whatever you want to do here
  "hello")

(define (round v)
  (cond
    [(number? v) (@round v)]
    [else (my-round v)]))

(define x 1.2)
(round x) ;=> 1.0
(define y "abc")
(round y) ;=> "hello"

round को एक फ़ंक्शन के रूप में परिभाषित करके, केस विश्लेषण मान पर किया जाता है, जिसे रनटाइम पर फ़ंक्शन में पास किया जाता है।

मैक्रो का उपयोग करना

(require syntax/parse/define 
         (only-in racket [round @round]))

(define-syntax-parser round
  [(_ x:number) #'(@round x)]
  [(_ x) #'"hello"])

(define x 1.2)
(round x) ;=> "hello"
(define y "abc")
(round y) ;=> "hello"
(round 1.2) ;=> 1.0
(round (this is not a sensible expression but it works (()))) ;=> "hello"

round को मैक्रो के रूप में परिभाषित करके, केस विश्लेषण सिंटैक्स खंड पर किया जाता है जिसे संकलन-समय पर मैक्रो में पास किया जाता है। उपरोक्त उदाहरण में, हम वास्तविक रैकेट के round का उपयोग करेंगे, जब मैक्रो का ऑपरेंड एक शाब्दिक संख्या है। बाकी सब कुछ "hello" में बदल जाएगा। ध्यान दें कि संकलन-समय पर, x जैसे पहचानकर्ताओं का मूल्यांकन नहीं किया जाता है और अभी तक किसी मान से संबद्ध नहीं किया जाता है। केवल एक चीज जो आप जानते हैं वह यह है कि यह एक पहचानकर्ता है, जो एक शाब्दिक संख्या नहीं है, इसलिए यह "hello" में बदल जाता है। मैक्रो विस्तार के बाद यह कार्यक्रम मोटे तौर पर होगा:

(require syntax/parse/define 
         (only-in racket [round @round]))

(define x 1.2)
"hello"
(define y "abc")
"hello"
(@round 1.2)
"hello"

चुनें कि आपको कौन सा पसंद है। मुझे संदेह है कि आप वास्तव में मैक्रो के बजाय फ़ंक्शन का उपयोग करना चाहते हैं।

2
Sorawee Porncharoenwase 27 पद 2019, 13:18