Python 101: Eğlenceli bir programlama diline genel bir bakış

0
FZ

Görüşler

0
FZ
"lambda formları basit fonksiyonlar olarak tanımlanabilir" denmiş, demek Python yavaş yavaş Lisp'ten bir şeye kapmaya başlıyor ama daha yolun başında gibi ;-)

Listelerle iş güç yapması ve map gibi fonksiyonların varlığı da güzel (benzer şeyler yanılmıyorsam map, grep şeklinde Perl'de de mevcut yani Lisp yol göstermeye devam ediyor ;-)
0
tongucyumruk
O zaman sana kötü haberi vereyim. Python'un yeni sürümlerinde lambda'nın inline fonksiyonlar lehine python'dan çıkarılması planlanıyor. Kendi adıma bir lambda sever olarak bunu pek onayladığımı söyleyemeyeceğim. Özellikle küçücük bir fonksiyona isim vermekle uğraşmak istemediğinizde lambda çok işe yarayabiliyordu. Umarım Guido van Rossum lambda'yı kaldırmak yerine yeteneklerini artırma yoluna gider. Zira lambda hakkındaki en önemli şikayet çok kısıtlayıcı olması.

Listeleri Python'un en eski sürümlerinden beri en çok öne çıkan veri yapılarından biri olmuştur. Zaten sanıyorum birçok fonksiyonel programlama konseptinin Python'un içerisinde bu kadar yer etmesinin sebebi de bu liste sevgisi. Ayrıca yeni yeni ortaya çıkmaya başlayan generator ve iterator gibi veri yapıları da listeler üzerinde işlem yaparken bellek kullanımını azaltarak programcıları listelerle işlemler yapmaya özendiriyor.

Kesinlikle LISP yol göstermeye devam ediyor...
0
ttk
Lisp kodlarına bakmıştım burada çıkan bir yazı üzerine ama hiç bir şey anlamamıştım.

Ama Python'ûn, yeni tanıyan birisi olarak ilk Dos'la tanıştığım zamanki Basic kadar bana sevimli geldiğini söylemeden geçemeyecem :)
Hem çok pratik hem de çok güçlü bir dil gördüğüm kadarı ile. Hatta, çalışırken önümüze tonla kolaylık seren Delphi gibi dillerden bile soğumama sebep oldu pratikliği sayesinde. Üstüne üstlük artık PHP ile değil de Python ile dinamik web içeriği hazırlamaya heveslendim bayağı bir.
0
FZ
Size yardımcı olabilmem için bana yardımcı olun lütfen, madem buradaki bir yazı (sanırım Kent Pitman röportajını kast ediyorsunuz, http://www.fazlamesai.net/modules.php?name=News&file=article&sid=2461) sizi motive etti ve gidip Lisp kodlarına baktınız o halde acaba nerede, hangi kodlara baktığınızı, kafanızı hangi kodların ne şekilde karıştırdığını yazabilir misiniz lütfen?

Eğer tam olarak hangi noktada takıldığınızı ve neyin, ne şekilde problem yarattığını belirtirseniz ben ve benden çok daha deneyimli FM üyeleri size yardımcı olmak ve Lisp ile ilgili kafa karışıklığını gidermek için elimizden geleni yaparız.
0
T-u-N-i-X
LISP'in tam olarak ne olduğunu, ne işlere yaradığını söyleyebilir misiniz ? Ben açıkcası programlama dili olarak şu anda C öğrenmeme rağmen bundan sonra Python, C++, Java ve PHP üzerine yoğunlaşmayı düşünüyorum.
0
tongucyumruk
http://www.fazlamesai.net/modules.php?name=News&file=article&sid=2461 adresindeki Kent Pitman röpörtajını okursanız sanıyorum aklınızdaki soruların çoğu yanıtlanacaktır.
0
bm
Devami da geliyor (hem ilgi oldugunu gorursek Pitman'in ikinci bolumu, hem ilgi olsun olmasin baska bir LISP yazisi).

0
FZ
Aaa, ne güzel! Ben ilgileniyorum valla ;-) Nerede o diğer Lisp yazısı? Belki beni de ikinci Pitman çevirisi için motive eder ;-)
0
FZ
Lisp, kullanımda olan en eski dillerden biridir. Lisp, çok güçlü, esnek bir programlama dilidir. Uzunca bir süredir belli bir standarda bağlı olarak ANSI Common Lisp olarak yoğun şekilde kullanılmaktadır.

Kısa bir ansiklopedi maddesine şuradan erişebilirsiniz:

http://tr.wikipedia.org/wiki/Lisp

Daha detaylı bilgilere ise İngilizceniz iyi ise şuralardan erişebilirsiniz:

http://en.wikipedia.org/wiki/Lisp_programming_language

http://en.wikipedia.org/wiki/Common_Lisp

Lisp, Python, Perl gibi diller için ilham kaynağı olmayı sürdürmektedir. Lisp'in gücünü vurgulayan ifadelerden biri de şudur:

Lisp is programmable programming language.

Yani Lisp, programlanabilir bir programlama dilidir. Başka bir deyişle fonksiyonel programlama, nesneye yönelik programlama ve benzeri programlama paradigmalarını Lisp'te doğal olarak kullanabilir ve dilin sözdizimini kendi işinize geldiği gibi genişletebilirsiniz. Lisp'in nesneye yönelik programlama bağlamında ortaya koyduğu MOP yani Meta Object Protocol mevcut esnekliğe ve güce bir başka örnektir:

http://en.wikipedia.org/wiki/CLOS

UNIX dünyasındaki önemli isimlerden, hackerlardan biri olan Eric Raymond, "Lisp'i kullanmayacak olsanız bile mutlaka bir ara vakit ayırıp çalışın, sizi daha iyi bir programcı yaptığını göreceksiniz" der. Lisp ile geliştirdiği web uygulamasını Yahoo'ya 40.000.000$'a satan Paul Graham ise buna karşılık "Eğer Lisp bu kadar güçlü ise neden doğrudan onu kullanmayayım ki, madem beni daha iyi bir programcı yapıyor?" diye cevap verir.

Lisp ile uğraşmaya başladıktan bir süre sonra BT (Bilgi Teknolojileri) dünyasında "yeni" olduğu iddia edilen pek çok şeyin aslında yeni olmadığını, birileri tarafından uzunca süredir kullanıldığını görürsünüz. Misal garbage collection (Java, .NET, C#), delegates, generic functions (.NET C#), self reflection (Java, C#), vs.

Lisp ile ilgili takıldığınız bir şey olursa buraya yazabilirsiniz. Ya da eğer İngilizceniz yeterli ise ve medeni cesaretiniz var ise şuradan faydalanabilirsiniz:

http://groups.google.com/groups?group=comp.lang.lisp

Java programcıları da yavaş yavaş "programlanabilir programla dili" kavramını düşünmeye ve bu konudaki önerilerini dile getirmeye başlamışlardır:

http://www.onboard.jetbrains.com/articles/04/10/lop/

Malum, işler karmaşıklaştıkça bu karmaşıklıkla başa çıkabilecek yöntemler gerekmektedir. Lisp vakti zamanında bir hayli karmaşık ve kolay kolay ele avuca gelmez problemlerin çözümünde kullanıldığı için bu bakımdan olgunlaşmıştır. Tapınaktaki uzun sakallı, kısık gözlü, gülümseyen bilge haline gelmiştir, küçücük dokunuşlarla büyük etkileşimlere yol açabilmektedir.
0
FZ
Common Lisp ile geliştirilen GUI yani grafik arayüzlü uygulamalardan birkaç örnek:

http://common-lisp.net/project/cells-gtk/
0
ttk
Merhaba

İlginiz için teşekkür ederim. Cevabınızı dün gördüm bayağı geç bir cevap olacak ama ...
Lisp ile ciddi olarak ilgilenmeyi düşünmedim ama kodlara bakınca en çok merak ettiğim anlayamadığımı düşündüğüm iki şey var, dökümana güzelce baksan anlardın diyebilirsiniz ama dikkatimi bir yerde yoğunlaştırmada problemim var epey bir.
- Birisi şu parantezler, bir satır veya emir parantezle başlayıp parantezle mi bitiyor ?
- İkincisi, işlemlerde değişkenlerle işlem işaretleri mutlaka birbirinden ayrı yerde mi durur Lisp'de ? Yani 2*2'yi ille * 2 2 gibi mi yazmak gerekiyor ?
- Bir de, standart programlama yapan, fazla da kafa karıştırıcı gelebilecek bir programcıya Lisp'i öğrenmesini, kazanabileceği bir şeyler olduğunu söylemek mümkün müdür ?
- Türkçe, ilk adımı attırabilecek, anlatımı sade bir kaynak tavsiye edebilir misiniz ?

Teşekkür ederim.
0
bm
Birisi şu parantezler, bir satır veya emir parantezle başlayıp parantezle mi bitiyor ?

Bunu kolay anlatip yanlis sey soylememenin yolunu bilmiyorum ben ama asagida deneyecegim. (evet o yazida o soruya benzer bir sorunun cevabi var bu arada.)

İkincisi, işlemlerde değişkenlerle işlem işaretleri mutlaka birbirinden ayrı yerde mi durur Lisp'de ? Yani 2*2'yi ille * 2 2 gibi mi yazmak gerekiyor ?

Islem isareti diye dusunmeyin. Soyle dusunelim: toplama bir fonsyon olsun, 2 + 2 yerine mesela C'de topla(2,2) diyecegimize lispde (topla 2 2) diyoruz. "Topla"ya da "+" dedik mi is bitiyor. Tabi (+ a b c d e) yazmak da mumkun cunku lispte fonsyon parametreleri sabit sayinda olmak zorunde degil.

Ozetleyecek olursak: diger dillerin tersine, bazi islemler "infix" (yani parametrelerin arasinda birsey olmasi a + b gibi) bazi seyler "prefix" (yani C'deki topla(a,b) gibi) degil. Normalde hersey "prefix" yani (topla a b) (+ a b) vs. Boyle olunca '+'nin bir fonksyondan farkli bir ozelligi olmadigini farkedeceksiniz.

- Bir de, standart programlama yapan, fazla da kafa karıştırıcı gelebilecek bir programcıya Lisp'i öğrenmesini, kazanabileceği bir şeyler olduğunu söylemek mümkün müdür ?

Eric Raymond'a sorarsaniz evet. Neyin pesinde oldugunuza, kendinizi nasil yetistirmek istediginize ve ne kadar vaktiniz olduguna bagli bunlar. Ciddi bir sekilde hem makineye hem programlama dillerine hakim olmak istiyorsaniz en azindan genel anlamda Common Lisp hakkinda bilginiz olmasi faydali olur (ama sadece o degil, C, belki smalltalk, belki prolog, okuyabilecek kadar en azindan bir RISC'in assembleri vs.). Yarin para kazanmak durumundaysaniz, tabi bunu bize degil o parayi verecek insana sormak lazim. Ufuk genisletmeye vakti olan sanslilardansaniz, deger.

Türkçe, ilk adımı attırabilecek, anlatımı sade bir kaynak tavsiye edebilir misiniz ?

Su anda benim bildigim birsey yok. FZ ile birseyler yapmayi dusunuyoruz (Common Lisp icin) ama gunle olculen bir zamanda ortaya cikmaz. Scheme icin belki vardir birseyler. Her halukarda ayaga dusmemis seyleri takip edebilmek icin Ingilizce okuyabilir olmak cok onemli. Biraz zorlamayala sokebilecek durumdaysaniz, Turkce giris dokumani olsun olmasin kendinizi zorlamaya bakin -- gerisi geliyor bir yerden sonra vakit heves ve caba olursa. (Konusmak, yazmak vs.den bahsetmiyorum, okudugunu anlamak ikisinden de kolay ve yeterli aslinda).

Bu Almanlar Fransizlar vs. icin de boyle, merak etmeyin. Ciddi ciddi Common Lisp kullanmak icin gereken bir kaynak olan ANSI standardinin html hali [www.lispworks.com]nin Ingilizce disinda cevirisi yok mesela.
0
FZ
Görülen o ki eğer bir yeni-başlayanlar-için-Common Lisp belgesi hazırlayacaksak en az bir potansiyel okur var.

Tabii biz öyle bir girizgâh hazırlamadan önce bir iki motive edici makale daha yayınlasak --mesela bir iki Graham çevirisi-- güzel olur diye düşünüyorum. ;-)
0
ttk
Cevaplar ve ilgi için tekrar teşekkür ederim.
Maymun iştahlılık yapıp bir tane linux için, iki tane de windows için Lisp geliştirme aracı mı ne denir, indirdim.

Uğraşıp "merhaba" yazdırabildim. Ama alınacak epey bir yol daha olsa gerek :))

Vakti zamânında (galiba en az 12 yıl önce - düşünüyorum da bu kadar zamanda Karakaçan bile sökerdi belki o dili :) uğraşıp da hâlen nasıl kullanıldığını öğrenemediğim Turbo Prolog'u bir yerlerden bulup kopyalamıştım. Biraz kendi örneklerini inceledim. Yabancı dil yetersiz, çevrede soracak kimse de yok bu nasıl kullanılır diye, öylece kalmıştı.

Bundan daha da önce, programlama dili denilince Basic, Cobol, Fortan, Lisp, Prolog ... diye isimleri sıra sıra okuduğumu da hatırlıyorum. Merak edip bir şeyler öğrenmeye uğraşıyorum ama fare gibi ucundan tırtıklayıp bırakıyorum.
Çoğunluk böyle midir bilemeyeceğim ama çok şey özellikle de zaman kaybettim kendi adıma. Yaş oldu 35 üstü, yaşı vakti müsait olanlara bari tavsiyem olsun, düzenli, amaçlı, gayretli çalışma alışkanlığı edinirlerse çok iyi ederler. İşlerine yaramayacak şeyi öğrenmesinler, öğrendikleri şeyi de yarım yamalak değil gerekli bütün ayrıntıları ile öğrensinler.

Bu da biraz kafa şişirme muhabbeti oldu ama idare edin işte, yaşlılık mâlum :)
0
FZ
Cevaplar ve ilgi için tekrar teşekkür ederim.
Maymun iştahlılık yapıp bir tane linux için, iki tane de windows için Lisp geliştirme aracı mı ne denir, indirdim.


Hangi araçları çekip kurdunuz acaba?


Uğraşıp "merhaba" yazdırabildim. Ama alınacak epey bir yol daha olsa gerek :))


Evet, ekrana sabit bir karakter katarı bastırmaktan biraz (!) daha karmaşık işler için kullanılıyor genellikle Common Lisp ;-)


uğraşıp da hâlen nasıl kullanıldığını öğrenemediğim Turbo Prolog'u bir yerlerden bulup kopyalamıştım. Biraz kendi örneklerini inceledim. Yabancı dil yetersiz, çevrede soracak kimse de yok bu nasıl kullanılır diye, öylece kalmıştı.


Vakti zamanında PC World dergisinin o zamanki kadrosu gayet sağlamdı ve çok güzel programlama ekleri verirdi ve mesela orada örnek Prolog programları olurdu.

Türkçe bir Prolog kitabı mevcut (Visual Prolog başlığı ile)

http://www.kitapyurdu.com/kitap/default.asp?id=42664&session=33999103881213711634&LogID=

Prolog, deklaratif (declarative) bir mantık programlama dilidir (logic programming) aynı zamanda kısıt koşul programlama için de kullanılabilir (constraint based programming).

Düzgün bir kaynaktan pedagojik olarak çalışılmadığı sürece kafa karıştırmaya çok müsaittir! Öte yandan çok güçlü bir dildir.



Bundan daha da önce, programlama dili denilince Basic, Cobol, Fortan, Lisp, Prolog ... diye isimleri sıra sıra okuduğumu da hatırlıyorum. Merak edip bir şeyler öğrenmeye uğraşıyorum ama fare gibi ucundan tırtıklayıp bırakıyorum.


Doğru dürüst kaynak olmaması maalesef önemli bir faktör. Lisp, Common Lisp ve bu ortamın gücüne dair öğretici (tutorial) tarzı ve hatta videolu, vs. bazı kaynakları hazırlama planlarımız var ancak tabii tamamen gönüllü bir çalışma olacağı için ve hazırlamayı düşünenlerin de başında bir ton olduğu için çok çabuk olamayacak. O zamana dek yine de her türlü teknik/psikolojik desteği vermeye hazırız gördüğünüz gibi ;-)


Çoğunluk böyle midir bilemeyeceğim ama çok şey özellikle de zaman kaybettim kendi adıma. Yaş oldu 35 üstü, yaşı vakti müsait olanlara bari tavsiyem olsun, düzenli, amaçlı, gayretli çalışma alışkanlığı edinirlerse çok iyi ederler. İşlerine yaramayacak şeyi öğrenmesinler, öğrendikleri şeyi de yarım yamalak değil gerekli bütün ayrıntıları ile öğrensinler.


Son cümlelerinize canı gönülden katılıyorum!
0
ttk
Merhaba

Prolog kaynağı için teşekkür ederim.
Şunları çekip kurdum, umarım daha önceki meraklarıma benzemez bunun sonu da :) :

Linux için (Fedora core 2 rpm'i) :
ftp://ftp.icm.edu.pl/vol/rzm8/linux-kde-redhat/fedora/fedora/2/RPMS.stable/cmucl-19-0.fdr.2.a.2.i386.rpm

Windows için ise şunlar :
60 günlük deneme sürümü :
http://ftp.franz.com/ftp/pub/acl62trial/windows/acl62_trial.exe

Bu ise şahsi kullanım için bedava :
ftp://ftp.xanalys.com/pub/software_tools/downloads/lwwper43r2/LispWorksPersonal.exe
Şu da üsttekinin dökümanlarının adresi :
ftp://ftp.xanalys.com/pub/software_tools/downloads/lwwper43r2/LispWorksPersonalDocumentation.exe
0
FZ
Cevapladığınız için teşekkürler, eğer sizin kadar hevesli birkaç kişi daha çıkarsa sanırım yazılacak belgeler bir amaca hizmet edecektir.

Yalnız tavsiyem şudur, acele etmeyin, Common Lisp de, tıpkı Prolog gibi pek çok bakımdan "sıradışı" bir dil. Düzgün bir şekilde, uygun, pratik örneklerle anlatılmadığı, diğer dillerle doğru dürüst kıyaslanmadığı takdirde, güzel problemler ve çözümler sunulmadığında YAPL, yani Yet Another Programming Language, yani Al Sana Bir Programlama Dili Daha sendromu yaşamak söz konusu! :) Sizin de belirttiğiniz gibi detayı ile, hepsini sindire sindire tam olarak öğrenmekte fayda var, böyle yapıldığında harcanan emekleri fazlası ile geri ödeyen kadirbilir, bilgece bir dil ;-)

Bu arada, birinci çektiğiniz sanırım Carnegie Mellon Üniversitesi tarafından geliştirilmiş ve desteklenmiş bir Common Lisp derleyicisi olan CMUCL.

Diğer ikisi ise multiplatform olarak çalışabilen tam özellikli Common Lisp geliştirme ortamları olan LispWorks ve AllegroLisp. Burada belki de dikkat edilmesi gereken nokta, UNIX ya da Windows'ta Lisp ile geliştirdiğiniz bir şeyi diğerine ya da mesela Max OS X'ye taşıma sıkıntısı olmadığı. O bakımdan içiniz rahat olsun.

Ancak tabii eğer becerebilirsek yazacağımız Common Lisp öğretici belgelerde Emacs+SLIME geliştirme ortamı ve SBCL (Steel Bank Common Lisp) derleyicisi üzerinden anlatacağız. Ve bunları da Debian üzerinden örneklendireceğiz, elbette diğer Linux, UNIX ve Windows sistemlere bu yazılımları kurmak mümkün ancak Debian GNU/Linux, Common Lisp'e en iyi desteği, paket desteğini, vs. veren Linux dağıtımlarından biri.
0
FZ
Mor Kitabı okuyan birinden bekleyeceğim türden bir yorum, teşekkür ederim ;-)

Burada olası bir yanlış anlamayı engelleyelim mi? lambda söz konusu olduğunda aslolan illa ki kısa, küçük fonksiyonlar vs. olmak zorunda değil, burada asıl vurgu tam o anda tanımladığımız ve kullanmak istediğimiz ve bunun için de bir isim verme zahmetine katlanmak istemediğimiz fonksiyonlar.

Yani düşünün ki bir fonksiyonumuz var ve bu fonksiyon bir parametre olarak yine bir fonksiyon alıyor (prosedürel ve orta seviyeli dillerle uğraşanlar için genellikle bu durum ileri seviyeli konu kabul edilir ve bir ton detay anlatıldıktan sonra anlatılır ancak, fonksiyonel programlama dilleri ile uğraşanlar için ise sıradan ve sık gündeme gelen bir pratiktir fonksiyona fonksiyon geçmek, bir fonksiyon geri döndürmek vs.) ve sonra bir iş güç yapıyor. Misal türev almak için bir fonksiyon yazdık, ve bu türev alma fonksiyonuna da bir parametre geçeceğiz yani al bu parametreyi (fonksiyonu) türet, sonucu ver diyeceğiz. Şimdi her seferinde bu türev alma fonksiyonuna geçireceğim fonksiyonu gidip önceden bir yerde mi tanımlamalıyım yoksa

(turet ((lambda (x) (+ (* x x) (cos x) (sin x) )) x))

deyip, git x^2 + cos(x) + sin(x) diye hemen şimdi tanımladığım fonksiyonun türevini al mı demeliyim?

Öteki türlü önce gidip bir yerlerde,

(defun tek-atimlik-fonk (x) (+ (* x x) (cos x) (sin x) ))

diye tanimlama yapip sonra

(turet tek-atimlik-fonk)

gibi bir şey demem gerekecek. Ya da mesela türev gibi "bu gerçek hayatta ne işimize yarayacak ki, müşteri databeyzindeki kayıtların türevini alacağız, hehe" tepkisini hak edebilecek bir örnek yerine

(grafik-ciz tek-atimlik-fonk) ve lambda muadilini de düşünebilirsiniz, herhalde bunu pratikte kullanabileceğiniz yerleri tahmin edebilmek için Einstein olmaya gerek yoktur ;-)

Listelere gelince, olağanüstü esneklik ve güçteki bu yapıları anlatmak için oturup bir Common Lisp öğretici belgesi yazmak lazım diye düşünüyorum. Python, Perl, vb. dillerin o tür yapıları bünyelerine katması boşa değil!

Not: Yukarıda verdiğim Lisp örneğini evde denemeyin! :) Sembolik türeve uygun şekilde yazmadım, yukarıdaki görüntüde daha ziyade sayısal bir değer alma şeklinde çalışan fonksiyonlardan esinlenilmiştir ama genel olarak derdimi izah edebilmek için yeterince yaklaşık bir örnek olduğunu düşünüyorum, FM'yi takip eden deneyimli Lisp programcılarının daha güzel örnekler verebileceğini tahmin ederim.
0
tongucyumruk
Demek istediğim lambda'nın LISP'teki kadar gelişmiş bir kullanımı olmadığıydı. LISP'teki herşeyin ( ) şeklinde tanımlandığı yazım tarzının aksine Python'da döngü kurmak veya koşullu işlem yapmak için if, for gibi keyword'ler bulunduğundan lambda kullanımı konusunda Python oldukça kısır kalıyor. Ancak fonksiyon döndüren fonksiyon demişken lambda'nın en sevdiğim kullanımlarından birini göstermezsem olmaz:

def artirici_uret(miktar):
return lambda x: x + miktar

bu sayede f = artirici_uret(5) dediğimizde verdigimiz parametreyi beşer beşer artıran nurtopu gibi bir f fonksiyonumuz oluyor. Aslında buradan bir de generator döndürmek vardı ama o başka bir yazının konusu... Çok yakında...
0
tongucyumruk
oops ( ) değil (expression parametreler) olacaktı... arada büyüktür küçüktür işretleri tag zannedilip güme gitti anlaşılan...
0
FZ
Yine bir yanlış anlamayı düzeltelim, yukarıdaki mesajdan sanki Lisp, daha doğrusu Common Lisp'te gelişmiş döngü yapıları, koşul ifadeleri yokmuş gibi anlaşılıyor, aksine Common Lisp'te çok gelişmiş döngü yapıları, koşul mekanizmaları, vs. söz konusu, olmaması zaten bir garip olurdu. lambda dediğimiz mefhum döngülerin, koşulların yerine geçen bir şey değil. Hemen bir örnek ile gösterelim:


(defun newtons-method (function function-prime initial-value max-iterations &optional (threshold 0.001))
(loop repeat max-iterations
with val = initial-value
do (let ((r (funcall function val)))
(when (< (abs r) threshold)
(return val))
(let* ((dr (funcall function-prime val))
(delta (/ r dr)))
(when (< (abs delta) threshold)
(return val))
(decf val delta)))))


Matematikte ve mühendislikte çok kullanılan yöntemlerden birini, Newton metodunu tanımladık, gördüğünüz gibi parametlerin bir kısmını fonksiyon olarak vermemizi bekleyen bir fonksiyon var şu anda elimizde. Şimdi Lisp komut satırında bu metoddan faydalanan bir komut yazalım:




CL-USER> (newtons-method (lambda (x) (- 9 (* x x))) (lambda (x) (* -2 x)) 2 100)
195313/65104




Görüldüğü gibi Common Lisp bize işlemin sonucunu tam olarak verdi, yani rasyonel bir sayı olarak hesaplayıp sundu. Herhangi bir veri kaybını otomatik olarak engellemiş olduk böylece. Yok eğer bunu float olarak yani kayan virgüllü sayı olarak istersek (Türk dilinde ondalık sayılar için nokta değil virgül kullanılır):




CL-USER> (float *)
3.000015




Tabii virgülden sonra hassasiyeti artırmak mümkün.




Ne yaptığımızı bir daha tekrarlayalım, fonksiyonları ve sayıları parametre olarak alan bir fonksiyon tanımladık. İçinde döngüler, değişken atamaları, koşullar kullandık, daha sonra bu fonksiyonu çağırdık ve çağırırken de hemen oracıkta, ayaküstü iki fonksiyon geçiriverdik parametre olarak. Neye? newtons-method fonksiyonuna. Sonucu da kesirli sayı olarak kesin şekilde elde ettik, daha sonra bunu virgüllü sayıya çevirdik. Sistemle bu şekilde etkileşimli şekilde çalışıp denemeler yaptıktan sonra artık bu Common Lisp programını derleyip, optimize bir ikili (binary) çalıştırılabilir dosya olarak insanlığa hediye edebiliriz :)
0
FZ
php-nuke küfrettikten sonra bir düzeltme denemesi:

Yine bir yanlış anlamayı düzeltelim, yukarıdaki mesajdan sanki Lisp, daha doğrusu Common Lisp'te gelişmiş döngü yapıları, koşul ifadeleri yokmuş gibi anlaşılıyor, aksine Common Lisp'te çok gelişmiş döngü yapıları, koşul mekanizmaları, vs. söz konusu, olmaması zaten bir garip olurdu. lambda dediğimiz mefhum döngülerin, koşulların yerine geçen bir şey değil. Hemen bir örnek ile gösterelim:


(defun newtons-method (function function-prime initial-value max-iterations &optional (threshold 0.001))
  (loop repeat max-iterations
        with val = initial-value
       do (let ((r (funcall function val)))
            (when (< (abs r) threshold)
            &nbps;  (return val))
            (let* ((dr (funcall function-prime val))
                     (delta (/ r dr)))
              (when (< (abs delta) threshold)
                (return val))
               (decf val delta)))))


Matematikte ve mühendislikte çok kullanılan yöntemlerden birini, Newton metodunu tanımladık, gördüğünüz gibi parametlerin bir kısmını fonksiyon olarak vermemizi bekleyen bir fonksiyon var şu anda elimizde. Şimdi Lisp komut satırında bu metoddan faydalanan bir komut yazalım:


CL-USER> (newtons-method (lambda (x) (- 9 (* x x))) (lambda (x) (* -2 x)) 2 100)
195313/65104


Görüldüğü gibi Common Lisp bize işlemin sonucunu tam olarak verdi, yani rasyonel bir sayı olarak hesaplayıp sundu. Herhangi bir veri kaybını otomatik olarak engellemiş olduk böylece. Yok eğer bunu float olarak yani kayan virgüllü sayı olarak istersek (Türk dilinde ondalık sayılar için nokta değil virgül kullanılır):


CL-USER> (float *)
3.000015


Tabii virgülden sonra hassasiyeti artırmak mümkün.


Ne yaptığımızı bir daha tekrarlayalım, fonksiyonları ve sayıları parametre olarak alan bir fonksiyon tanımladık. İçinde döngüler, değişken atamaları, koşullar kullandık, daha sonra bu fonksiyonu çağırdık ve çağırırken de hemen oracıkta, ayaküstü iki fonksiyon geçiriverdik parametre olarak. Neye? newtons-method fonksiyonuna. Sonucu da kesirli sayı olarak kesin şekilde elde ettik, daha sonra bunu virgüllü sayıya çevirdik. Sistemle bu şekilde etkileşimli şekilde çalışıp denemeler yaptıktan sonra artık bu Common Lisp programını derleyip, optimize bir ikili (binary) çalıştırılabilir dosya olarak insanlığa hediye edebiliriz :)
0
FZ
Valla formatlama ancak bu kadar oldu! Neyse, sanırım ana fikir anlaşılmıştır, tabii yukarıdaki fonksiyonu daha da kısaltmak mümkün. İpucu: Daha önce adi gecen (turet ...) fonksiyonu kullanilabilir böylece newtons-method fonksiyonuna sadece bir fonksiyon geçeriz, türevi kendisi hesaplar.

Bu örnekler için FM üyesi ve deneyimli Lisp programcısı BM'ye teşekkürler.

Yukarıdaki mevzuyu daha somut, sınıf ortamında ve bilgisayarda uygulamalı olarak izlemek isterseniz ve Scheme olarak (bir nevi Lisp ;-) anlatılmasını kabul ederseniz:

http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/

adresindeki Lecture 2a ve Lecture 2b videolarını izlemenizi öneririm.
0
malkocoglu_2
Ellerinize saglik, sunum sekli ve anlatimi cok guzel. Birden fazla deger dondurebilmenin ihtiyacini su zamanlarda cok hissediyorum, bunun Phyon'da destekledigini bu belgeden ogrenmis oldum, sevindim. Lambda kullanimi da guzel. Umariz bu dil gelisir ve birgun bilgi islem projelerimizde kullanma sansina erisiriz. Genel kuralim sudur: Bir dil icin ne zaman IDE ile kod uretiyorsak, o dilden daha iyisi olabilir demektir, ve Java icin for(...){} dongulerinden baslayarak, ve en basitinden import tabirlerini bile artik surekli uretmekteyiz, demek ki daha sade bir sozdizim yapisi mumkundur. Tek cekincem Java sanal makinalarina ve oldukca fazla API setine olan kitlenme sebebiyle, kurumsal programlar icin istedigimiz dile gecemeyisimiz. Insallah bir gun. Phyton'a soyle sIkI bir ticari sponsor lazim, onu MS-oldurucu silah olarak kullanmak isteyecek birileri. Bkz. Sun Microsystems ornegi.





Görüş belirtmek için giriş yapın...

İlgili Yazılar

Dopdolu ve Türkçe GNU/Linux Dergisi

FZ

LinuxFocus'un ilk sayısı Kasım 1997´de çıktı. LinuxFocus, İngilizce konuşulmayan ülkerdeki Linux hayranlarının elinde, Linux ile ilgili yazılı kaynakların ve onlar için desteğinin pek olmadığının anlaşılması üzere, Miguel Angel Sepulveda ve arkadaşları tarafından başlatılmıştır.

Derginin Kasım -Aralık 2003 sayısındaki konulardan birkaç örnek vermek gerekirse: GIMP: Kendi fırçalarınızı oluşturun, Blender ile 3D: Bir oda dolusu oyuncak, Çokluişlem programlama - Mesaj kuyrukları (3), Linux ile sıcaklık izleme

O´Reilly´den 2003´ün En İyi Makaleleri, İpuçları ve Kitapları

FZ

Bilgi işlem dünyasının efsanevi yayıncısı O´Reilly ziyaretçi istatistikleri ve okur görüşlerine dayanarak Top 10 makalelerini, ipuçlarını, kitaplarını, vs. seçti. Python, Mac OS X, RegExp, PHP, Mozilla, Python, RSS, Flash MX, Extreme Programming, Java, mplayer, vs. gibi konularda sene boyunca en çok ilgi görmüş, bilgilendirici, vizyon açıcı makalelerin listesini ONLamp Best of 2003 ve O´Reilly Best of 2003 adreslerinde bulabilirsiniz.

Bu arada FM editörlerinden sundance arkadaşımızın mplayer ile ilgili makalesinin ONLamp Top 10 listesinde ikinci sırayı işgal ettiğine dikkat çekmek isterim. Gönül isterdi ki, dünya çapında network adminleri arasında infial yaratan Netcat and Reverse Telnet makalesi de listeye girsin ;-) Ama olsun, o bizim gönüllerimizde alması gereken yeri çoktan aldı :)

e-Bergi Ekim 2008 Sayısı Çıktı!

anonim

Ekim ayında da, doyurucu içeriği ve ilgi gören programlama sorusu ile e-bergi sizlerle.

Linux Açılış Disketi NASIL

yalcink01

Hep hayalini kurduğum şey, kendi başıma imal ettiğim bir işletim sistemi idi. Baktım ki bu iş oldukça uzun bir zamana mal olacak, ben de hayalimi güncelledim ve kendi birleştirdiğim bir işletim sistemi yapmaya karar verdim. Hani legolar var ya onun gibi bir şey işte. Eh, Linux çekirdeği artı GNU araçları ve bilumum özgür yazılım etrafta cirit atıyor:) Al parçaları birleştirmeye başla dedim ama işte orada tıkandım kaldım. Parçaları bulmak kolay ama bir GNU/Linux İşletim Sistemi nasıl çalışır, temel parçalar nelerdir, kim kimi tetikliyor, kimin eli kimin cebinde konuları biraz karışık. Demokraside çare tükenmez deyip kendi yol planımı yaptım ve işe başladım: Öncelikle "bu sistem nasıl açılır, temel parçalar ve ana hatlar nelerdir?" sorununun yanıtını bulabilmek amacı ile The Linux Bootdisk HOWTO kılavuzunu hatim eyledik. Sırada Çekirdek Çitleme Kılavuzu (tldp tarafından şu an güncelleniyor) ve The Pocket Linux kılavuzu var.

Linux Açılış Disketi NASIL kılavuzu; bir açılış disketi yapımını anlatmakla birlikte -ki bu işin çok daha kolay bir yöntemi de mevcuttur:mkbootdisk- sistemin ilk ateşlemesini ve bu sistemin çalışması için gereken temel araçları açıklaması yönünden bence oldukça önemli bir başlangıç noktasını oluşturmakta. İyi bir başlangıç olmakla birlikte, sistem temellerini anlayabilmek için tek başına yeterli olmasını beklemeyin. Zaten kılavuzun ana hedefi de bu değil. Adı üstünde: açılış disketi nasıl yapılır, onu anlatıyor :)

Her halükarda okunması gereken ve Linux öğrenmeye çalışan benim gibiler için, uygulanması gereken bir kılavuz. Init'in ne olduğunu anlamadan önce, init'in herşeyin atası olduğunu anlamak gerekir, öyle değil mi?

http://www.geocities.com/yalcink01/bootdisk-howto/index.html adresinden belgeye ulaşabilirsiniz. Her zaman olduğu gibi: her türlü geribeslemeye kapımız açıktır

E-Bergi : Odtü Bilgisayar Topluluğu Dergisi

anonim

ODTÜ Bilgisayar Topluluğu Elektronik Dergisi E-Bergi Nisan 2008'de bir yaşına giriyor. Peki nedir bu e-bergi?