Tonguç Yumruk'un Weblog'u
Anlık olaylar, fikirler, gudik ismail vs...

Wed, 15 Nov 2006

Dün Common Lisp ve ağ uygulamaları gibi şeylerle oynarken kullanıcıdan bir IP adresine ilişkin bilginin en kolay nasıl alınabileceğini düşündüm. Tabii interaktif bir uygulamada bu o kadar büyük bir problem değil. Peki ya CL kodu şeklinde bir programın ayar dosyasını üretmeye çalışıyorsak? O zaman kullanıcının bu değerleri çift tırmak karakterleri içinde yazması gerekirdi ki bu da eğlenceli değil. Bunun üzerine ilk aklıma gelen şey kullanıcıların #IP192.168.1.1 şeklinde yazabilecekleri bir Reader Macro yazmak olduysa da sonradan daha kolay bir yöntem olduğunu farkederek aydınlandım! Common Lisp'te en çok uğraştığımız şeylerden biri nedir? Semboller! Peki bir IP adresi sembol olabilir miydi? En kolay yolu denemekti...

; SLIME 2005-12-27
CL-USER> '192.168.1.1
|192.168.1.1|
CL-USER>

Evet, IP adreslerini sembol olarak kullanabiliyoruz... Güzel. Peki bu sembolü kendi programımızın kullandığı IP adresi biçimine nasıl çeviririz? Hm... Mesela bir metine çevirip metni de "." karakterini kullanarak bölsek... Belki... Önce bir sembolümüzü metne çevirelim...

CL-USER> (symbol-name '192.168.1.1)
"192.168.1.1"
CL-USER>

Tamam, bunu yapabiliyorsak geriye kaldı metni işlemek... İşimizi kolaylaştırması için split-sequence paketini kullanmamız hiç fena olmaz bence...

CL-USER> (asdf:oos 'asdf:load-op :split-sequence)
; loading system definition from
; /usr/share/common-lisp/systems/split-sequence.asd into #<PACKAGE "ASDF0">
; registering #<SYSTEM :SPLIT-SEQUENCE {B015E11}> as SPLIT-SEQUENCE
NIL
CL-USER> (split-sequence:split-sequence #\. (symbol-name '192.168.1.1))
("192" "168" "1" "1")
11
CL-USER>

Tamam, bir yerlere gelmeye başladık. Fakat aklıbaşında hiçbir insan evladının bir IP adresini dört adet metin halinde saklayacağını sanmıyorum. En iyisi biz bunları sayı yapalım.

CL-USER> (mapcar #'parse-integer (split-sequence:split-sequence #\. (symbol-name '192.168.1.1)))
(192 168 1 1)
CL-USER>

Voila!

Not: Tabii bu iş Python'la map(int, "192.168.1.1".split('.')) şeklinde de yapılabilir. Ancak ne yazık ki Python'da sembol diye bir yapı olmadığı için metin kullanmak zorunda kalıyoruz ki, bu da zaten asıl amaca ters. Python ile ne kadar DSL yazılır, dil ne derece eğilip bükülebilir konularına ise girmek istemiyorum...

[15:26] | [/kod] | # | G! |
Elektrikli Posta
Uptime
1 yıl, 26 gün, 4 saat, 31 dakika
Çocuklara Bilgisayar
Kategoriler
/ (201)
  dev/ (13)
  kod/ (28)
  life/ (2)
  linux/ (38)
    freedays/ (2)
    senlik/ (0)
      2006/ (15)
  misc/ (58)
  mobil/ (3)
  musiki/ (18)
  net/ (10)
  tech/ (9)
  web/ (5)
Zaman Makinesi
< November 2006 >
SuMoTuWeThFrSa
    1 2 3 4
5 6 7 8 91011
12131415161718
19202122232425
2627282930  
Kapı Komşuları
Güzel Siteler
Ivır zıvır
XML Feed

FSF Associate Member: 2040

Powered by PyBlosxom

Valid XHTML 1.0!