Jan 2, 2013

ทำ Optional Argument แบบ LaTeX

command ใน LaTeX นั้นมีวิธีเรียกใช้ที่ต่างจากภาษาโดยทั่วไปอยู่บ้าง ลองดู
\sqrt{x}
\sqrt[3]{x}
อันด้านบนจะวาด √x (รากที่สองของ x -- โดยปรกติ รากที่สองไม่จำเป็นต้องมีเลข 2 กำกับ) ส่วนอันล่างจะวาด ∛x

รูปร่างของ syntax ที่น่าสนใจคือ ส่วนที่เป็น optional argument จะถูกเรียกขึ้นมาก่อน main argument แถมยังใช้วงเล็บแยกกันอีก นี่ทำให้การ currying เป็นไปได้อย่างง่ายดาย
\newcommand{\cbrt}{\sqrt[3]}
...
\cbrt{x}
จริงๆ แล้วทาง math ก็มีฟังก์ชันในแนวคิดนี้อยู่เยอะ อย่างเช่น σx(n) ซึ่งเขียนแบบนี้แล้วเข้าใจง่ายกว่า σ(n, x) และยังไม่สับสนอีกว่า argument ตัวไหนที่ควรเป็น n หรือ x กันแน่

แล้วถ้าอยากได้แบบนี้ใน Python บ้าง? ง่ายนิดเดียวเพราะใช้เทคนิคเดียวกับ Infinite List นั่นเอง
@singleton
class sigma:
    def __call__(self, n, x=1):
        if n == 1:
            return 1
        return product( sum((k**x)**i for i in range(v+1))
                            for k, v in Counter(factor(n)).items() )
    def __getitem__(self, x):
        def partial_sigma(n):
            return self(n, x)
        return partial_sigma
คราวนี้จะเขียน
6 == sigma[1](6) - 6
หรือกระทั่ง
tau = sigma[0]
...
[tau(i) for i in range(return 1, 10)]
ก็ย่อมได้

Jan 1, 2013

ปี 2012 ของฉัน

1 ปีนี่ผ่านไปเร็วจริงแฮะ สงสัยว่าเป็นปีที่ไม่ค่อยผาดโผนอะไรมากด้วย สรุปออกมาได้แค่

  • เว็บ Tutor0x ตอนนี้ทะลุ 200 like แล้ว (วันสุดท้ายก่อนปีใหม่พอดี)
  • ไป BarCamp เยอะมาก ทั้ง เชียงราย (ม.ค.), เชียงใหม่ (ม.ย.), บางเขน (ก.ย.), กรุงเทพ (ต.ค.)
  • เล่น Project Euler โจทย์มันโหดดี แถมยังช่วยให้คิดหัวข้อสัมมนาออกง่ายๆ เลยด้วย
  • Linux ทั้งตัว เพราะโดนกาต่ายยักษ์แกล้ง TwT
  • Python Magic เล่นแล้วรู้สึกเป็นหมอผีเพิ่มขึ้นมาเยอะเลย 555+ (ตัวอย่าง: Infinite List, Callable Num)

ส่วน achievement คืนข้ามปีคือดูหนังโรงฮะ (Wreck-It Ralph)