में मैं कुछ विधेय है, उदाहरण के लिए:Pointfree समारोह संयोजन अजगर
is_divisible_by_13 = lambda i: i % 13 == 0
is_palindrome = lambda x: str(x) == str(x)[::-1]
और तार्किक उन में के रूप में संयोजित करना चाहते हैं:
filter(lambda x: is_divisible_by_13(x) and is_palindrome(x), range(1000,10000))
सवाल अब है: इस तरह के संयोजन एक में लिखा जा सकता है pointfree शैली, जैसे:
filter(is_divisible_by_13 and is_palindrome, range(1000,10000))
यह नहीं वांछित प्रभाव क्योंकि निश्चित रूप से है लैम्ब्डा कार्यों की सच्चाई मूल्य True
और and
और or
कम सर्किटिंग ऑपरेटरों रहे हैं। निकटतम बात मैं के साथ आया एक वर्ग P
जो एक सरल विधेय कंटेनर कि __call__()
लागू करता है और तरीकों and_()
और or_()
विधेय गठबंधन करने के लिए है परिभाषित करने के लिए किया गया था। P
की परिभाषा इस प्रकार है:
P(is_divisible_by_13).and_(is_palindrome)
जो ऊपर लैम्ब्डा समारोह के बराबर है:
import copy
class P(object):
def __init__(self, predicate):
self.pred = predicate
def __call__(self, obj):
return self.pred(obj)
def __copy_pred(self):
return copy.copy(self.pred)
def and_(self, predicate):
pred = self.__copy_pred()
self.pred = lambda x: pred(x) and predicate(x)
return self
def or_(self, predicate):
pred = self.__copy_pred()
self.pred = lambda x: pred(x) or predicate(x)
return self
P
के साथ मैं अब एक नया विधेय है कि इस तरह विधेय का एक संयोजन है बना सकते हैं। यह मेरे पास जो कुछ भी है, उसके करीब आता है, लेकिन यह भी पॉइंटफ्री नहीं है (अंक अब उनके तर्कों के बजाय भविष्यवाणी कर रहे हैं)। अब दूसरा सवाल यह है: वहाँ (शायद कोष्ठकों और डॉट्स के बिना) P
की तरह और (लैम्ब्डा) कार्यों का उपयोग किए बिना वर्गों का उपयोग करने से अजगर में विधेय गठबंधन करने के लिए एक बेहतर या कम रास्ता नहीं है?
ऐसा लगता है कि आप एक कार्यात्मक भाषा की तरह व्यवहार करने वाली गैर-कार्यात्मक भाषा बनाने के लिए बहुत मेहनत कर रहे हैं। क्या आप पाइथन से बंधे हैं? –
@Eric: हाँ, तरह का। मेरा पायथन कोड एक सी ++ प्रोजेक्ट में एम्बेडेड है और मैं सिर्फ दूसरी भाषा में स्विच नहीं कर सकता। –