मेरे पास टीसीएल में कोड है जिसके लिए मैं केवल एक चर सक्षम होने पर प्रिंट करना चाहता हूं। यदि संभव हो तो मैं इसे एक पंक्ति में करना चाहता हूं।

#in perl 
print "Device name $dev" if(-e $debug);
#in tcl
if {[tvf::svrf debug ]}{
    puts "Device name is $dev"
}
0
Alan Saldanha 4 जिंदा 2021, 09:30

5 जवाब

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

मैं इसे कई पंक्तियों में विभाजित करूंगा जब तक ऐसे कई स्थान होंगे जहां आप यह निर्णय लेते हैं। यदि आप इसे कई जगहों पर कर रहे हैं, तो एक प्रक्रिया स्थापित करना बेहतर है:

# A single-line way to write this
proc writeDebugMessage args [lindex {{} {puts [lindex $args 0]}} [tvf::svrf debug]]

# At the places where you want to print a message in some cases
writeDebugMessage "Device name is $dev"

यह प्रक्रिया परिभाषा इस लंबे संस्करण को लिखने का एक-लाइनर तरीका है:

if {[tvf::svrf debug]} {
    proc writeDebugMessage args {puts [lindex $args 0]}
} else {
    # This exact form of procedure gets bytecode compiled into nothingness; max efficiency!
    proc writeDebugMessage args {}
}

यदि यह मेरा वास्तविक कोड होता, तो मैं लंबे संस्करण या इससे भी अधिक वाचालता का उपयोग करता!


एक सच्चा वन-लाइनर संस्करण संभव है, और यह लगभग उतना ही छोटा है जितना इसे मिलता है:

[lindex {list puts} [tvf::svrf debug]] "Device name is $dev"

अनुशंसित नहीं! एक सहायक प्रक्रिया को परिभाषित करने से बहुत अधिक पठनीय कोड उत्पन्न होता है!

1
Donal Fellows 4 जिंदा 2021, 11:36

टीसीएल में इस सरल पर्ल कमांड को परिभाषित करने से आपको कुछ भी ठीक से रोक नहीं सकता है:

proc print {msg args} {
  # never mind, this is for fun only
  if {[string match "if(-e *)" $args]} {
    if {[string range $args 6 end-1]} {puts $msg}
  } else {
    # other Perl stuff whatever it was
  }
}

... और Tcl में इस Perlish प्रिंट का उपयोग करें:

set dev "'Perl device'"
# ------------
set debug true
print "Device name $dev" if(-e $debug)
print "Is it true?" if(-e true)
print "Is it false?" if(-e false)
# ------------
set debug false
print "2. Device name $dev" if(-e $debug)
print "2. Is it true?" if(-e true)
print "2. Is it false?" if(-e false)

इस तरह आप टीसीएल में सभी पर्ल को फिर से परिभाषित कर सकते हैं ;-)

0
Alex P 6 जिंदा 2021, 15:40

टीसीएल पर्ल के कथन संशोधक को समायोजित नहीं करता है। यह पूरी तरह से Tcl के command arg arg ... सिंटैक्स के कारण है।

यदि आपको वह शैली पसंद है, तो आप एक सहायक खरीद बना सकते हैं:

proc do {script if condition} {
    if {$if ne "if"} {
        error "some usage message"
    }
    if {[uplevel [list expr $condition]]} {
        uplevel $script
    }
}

फिर:

% set debug true
true
% do {puts "I'm debugging"} if {$debug}
I'm debugging
% set debug false
false
% do {puts "I'm debugging"} if {$debug}
%

उस do खरीद को do ... while ... आदि के साथ बढ़ाया जा सकता है।

0
glenn jackman 4 जिंदा 2021, 23:13
if {[tvf::svrf debug ]} { puts "Device name is $dev" }
1
Dinesh 4 जिंदा 2021, 09:33
set dev debug_device
interp alias {} print {} apply {{args {dbg 0}} {expr {$dbg?$args:{}}}}

set debug true
print "Device name is $dev" $debug

एक त्वरित एक-लाइनर उपनाम अनाम फ़ंक्शन के रूप में लागू होता है।

0
syox 6 जिंदा 2021, 22:05