Re: [cs-lisp] nerde kalmistik.?
On Feb 7, 2008 9:28 PM, Utku Somer <[EMAIL PROTECTED]> wrote: > sanirim > > (generate rules-list axiom-list) > > tadinda bir sey istiyordun. yani kurallar listesi verilecek, baslangic > liste verilecek, sonraki nesili cikaracak. tabii bunu yazarken > kurallar listesi icindeki (burdaki grammer'in turkcesi?) butun > kurallari taramak ve o anda gerekeni bulmak lazim gerekecek. h. > > Hmm, ben ilk verilen ornegi pek sevemedim. arkadas kurallari string > olarak vermis, ve sonucta yaptigi sey de yine pattern matching ve > string replace. Ben L-sistemi uc boyutlu olarak kullanip agaclar > cizmistim vakti zamaninda ve stringler ile tutmustum. hic tavsiye > etmiyorum, cok yer tutuyor, bir sekilde stream sistemi kurmak cok daha > iyi olabilir. Aslinda yukarida bir semboller listesi kullanilmis. Sembollerin fazla yer tutan seyler olduklarini sanmiyorum. Bence buyuk bir ihtimalle hafizadaki bir string'e (veya benzer bir yapiya) pointer'dirlar ve ayni semboller icin yeni hafiza ayrilmiyordur. > demek istedigim su: > > (defun l () > `(,#'l)) > > (defun r () > `(,#'r)) > > ;90 derecelik koch egrisi ornegimiz olsun > (defun f () > `(,#'f ,#'l ,#'f ,#'r ,#'f ,#'r ,#'f ,#'l ,#'f)) > > > (defun grow (fractal) > (if (null fractal) > () > (append (funcall (car fractal)) (grow (cdr fractal) > > generasyon isini boylece halletmis oldum. cizim isi icin daha fazla > sorun mu yarattim? bu da benim sorum olsun. :) Ben yine de sembollerle calisilmasini oneririm. Yukaridaki ornekte veri kurallara siki sikiya bagli, pek esnek degil. Soyle birsey yapilabilir: (defvar *rules* (make-hash-table)) (setf (gethash 'F *rules*) '(F L F R F R F L)) (defun get-replacement (old) (gethash old *rules* (list old))) (defun grow (fractal) (let ((new-fractal '())) (dolist (old fractal (nreverse new-fractal)) (dolist (new (get-replacement old)) (push new new-fractal) (defun deneme () (format t "~{~a ~}~%" (grow (grow '(F (let ((*rules* (make-hash-table))) ; *rules*'a yeni deger verebiliyoruz (setf (gethash 'F *rules*) '(A F B F)) (format t "~{~a ~}~%" (grow (grow '(F)) -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] core-server-installer
On 10/11/07, Evrim Ulu <[EMAIL PROTECTED]> wrote: > (ubuntu'da sbcl paketini bulamadim bilen goren varsa beni aydinlatirsa > sevinirim) Ben feisty uzerinden bulabiliyorum: http://packages.ubuntu.com/feisty/devel/sbcl -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] Re: Bram Cohen'in İşe Alma Sorusu (Merhaba Liste)
On 8/14/07, Aycan iRiCAN <[EMAIL PROTECTED]> wrote: > Alp Özmert yazmış: > > Selam! > > > > Selem <[EMAIL PROTECTED]> yazmış: > > > > > >> -- What is the exponent of the largest power of two whose base seven > >> representation doesn't contain three zeros in a row? > >> > > > > Hiç de optimal olmayan bir çözüm: > > > > (do ((i 1 (1- i))) > > ((not (search "000" (write-to-string (expt 2 i) :base 7))) > > i)) > > > > Bu soru ile uğraşırken çözemediğim bir problem ile karşılaştım. Bu > > betiği onbin değil de yüzbinden geri saydırınca tabii ki de zaman > > alıyor. Ben de bir kaç kere bölüp nerelerde olduğuna bakmak istedim > > ama beceremedim. (Bölüp değişkenlerin değerlerine işlev çağrılarına > > falan bakabiliyorum ama i'nin değerini bulamadım.) Yardımcı > > olabilecek olursa sevinirim. > > > > Saygılar, > > Alp Özmert > > > http://hpaste.org/2240 > > Acemi bir programcı olarak ben de aynı deneme yanılma çözümünü haskell > ile denedim. İlginç bir problemmiş, üzerinde düşünmesi bile eğitici. > Teşekkürler. > > Sevgiler... > -- > aycan Ben de sizin koddan yola cikarak ussun degil de exponent'in kendisinin bulunmasini sagladim. En son 8833 buldu. Bu iletiyi gonderirken acik unutmusum programi, bilgisayarin hafizasini doldurdu. Ayni programi baska dilde (mesela C'de) yazsaydik boyle hafiza kullanilmazdi. Ya hafizayi dogru kullanan Haskell programi yazmayi bilmiyorum, ya da programi interpreter'dan calistirdigim icin bazi optimizasyonlar yapilmiyor. Denemek icin programi derleyeyim dedim, fakat bu sefer de monadlara takildim. main = map (putStrLn . show) setC veya main = foldl1 (>>) $ map (putStrLn . show) setC gibi seyler denedim, olmadi. En sonunda main = foldr1 (>>) $ map (putStrLn . show) setC seklinde oldu. Ve evet, bu sekilde hafiza problemi yok :) Haskell'de kod yazmak aslinda zevkli (fonksiyonlari manipule etmek falan), yalniz okunakli kod yazmasi zor gibi (kendi kodumdan bahsediyorum). Bir de asagida tanimladigim parallel fonksiyonu gibi calisan standard bir fonksiyon yok mu Haskell'de? Soyle bir baktim, bulamadim. (Afedersiniz, yukaridaki yazi ugrastigim seyleri aninda buraya yazdigim icin biraz karisik oldu sanirim, uzun zaman sonra Haskell'e tekrar bakan birinin karsilastigi problemler olarak degerlendirebilirsiniz). module Main where import Numeric import Char import List import Data.List parallel :: (x -> a, y -> b) -> (x, y) -> (a, b) parallel (f, g) (x, y) = ((f x), (g y)) setA = iterate (parallel ((+1), (*2))) (0, 1) setB = [ (x, showIntAtBase 7 (intToDigit) y "") | (x, y) <- setA] setC = map fst $ filter (not . isInfixOf "000" . snd) setB main = foldr1 (>>) $ map (putStrLn . show) setC -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] Fonksiyon Gölgeleme
On 2/21/07, Volkan YAZICI <[EMAIL PROTECTED]> wrote: Merhaba, Bildiğim kadarı ile FLET lexical scope'ta geçerli oluyor. Şöyle ki: (defun cons-test (p q) (cons p q)) (defun mapcar-test (proc lst) (if (null lst) '() (cons-test (funcall proc (first lst)) (mapcar-test proc (rest lst) (flet ((cons-test (p q) (cons 1 (cons p q (mapcar-test #'(lambda (p) (* p 2)) '(1 2 3 4))) => '(2 4 6 8) MAPCAR-TEST, FLET tarafından tanıtılan CONS-TEST'i dikkate almadı. Bu sebeple özellikle fonksiyonların dynamic scope'ta değerini nasıl gölgeleyebileceğimizi sormuştum. Eger degistirmis olsaydi bile cons-test cons'u kullandigi icin sonsuz donguye girmis olacaktik. cons kullanmayan cons'un yerine gececek herhangi bir fonksiyon yazmak da pek kolay degil. Ama lisp'de esas cons'a ulasmanin da bir yontemi vardir mutlaka, o sekilde yapilabilirdi. -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] [Fwd: [cs-discuss] a hard to understand scheme program]
http://en.wikipedia.org/wiki/Lambda_calculus http://en.wikipedia.org/wiki/Fixed_point_combinator bir fonksiyonun fixed point combinator olmasi icin (fix f) == (f (fix f)) olmasi lazim imis. fix fonksiyonunu lambda calculus seklinde yazalim: (\z.z z z z z z z z z z z z z z z z z z z z) (\P u t t i n g S c h e m e t o W o r k ! . ! (\b . W o r k W o r k W o r k W o r k W o r k ! b)) veya (\P u t t i n g S c h e m e t o W o r k ! . ! (\b . W o r k W o r k W o r k W o r k W o r k ! b)) ifadesine kisaca X dersek: (\z.z z z z z z z z z z z z z z z z z z z z) X yani (fix f) su oluyor: (\z.z z z z z z z z z z z z z z z z z z z z) X f == (beta) X X X X X X X X X X X X X X X X X X X X f == (ilk X'i tam yazalim) (\P u t t i n g S c h e m e t o W o r k ! . ! (\b . W o r k W o r k W o r k W o r k W o r k ! b)) X X X X X X X X X X X X X X X X X X X f == (beta) f (\b . X X X X X X X X X X X X X X X X X X X X f b) == (eta) f (X X X X X X X X X X X X X X X X X X X X f) Buradan da (fix f) == (f (fix f)) cikiyor. -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] [Fwd: [cs-discuss] a hard to understand scheme program]
fix'in nasil calistigini anlamak guc, ama isminden fixpoint combinator oldugu anlasiliyor. Bu yuzden ((fix (lambda (f) (lambda (n) (if (zero? n) 1 (* n (f (- n 1))) 9) yaklasik suna denk geliyor (define f (lambda (n) (if (zero? n) 1 (* n (f (- n 1)) (f 9) yani 9! hesaplaniyor. Simdi fix'in niye fixpoint oldugunu bulmak gerek :) ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] Re: Eldeki Parala r ile İstenen Miktarı Yakalamak
On 1/11/07, Volkan YAZICI <[EMAIL PROTECTED]> wrote: On Jan 11 12:18, Volkan YAZICI wrote: > (define (available-changes amount coins) > (cond >((= amount 0) '()) >((< amount 0) #f) >(else > (append-map > (lambda (coin) >(let ((avails (available-changes (- amount coin) coins))) > (cond > ((not avails) '()) > ((null? avails) (list coin)) > (else >(append-map > (lambda (changes) > (list (cons coin changes))) > avails) > coins Sorun şu ki yukarıdaki kod neredeyse çalışıyormuş. Çok ufak bir corner-case dışında. Onun için ufak bir düzeltme ile çalışan kod aşağıda: (define (available-changes amount coins) (cond ((= amount 0) #f) ((< amount 0) '()) (else (append-map (lambda (coin) (let ((avails (available-changes (- amount coin) coins))) (cond ((not avails) (list coin)) ((null? avails) '()) (else (append-map (lambda (changes) (list (cons coin changes))) avails) coins Fakat para birimleri arasına 1 eklendiği zaman olasılık uzayı inanılmaz şekilde artıyor ve program sonsuz bir d,Av(Bng,A|(Bye girmişcesine benim yavaş makinemde neredeyse saatlerce ,Ag(Balışıyor. (Bunun ddışında Guile'ın stack depth overflow noktasına gelip swap'ten yemeye başladığını s,Av(Bylemiyorum bile.) Şimdi sorumu yeniden soruyorum, bu işi daha optimize bir şekilde yapmanın yolu var mıdır? Yani para birimi i,Ag(Binde 1 varken de algoritma ,Ag(Balışabilsin. İyi çalışmalar. Merhaba, Su sekilde de olabilir (algoritmanin kalan kisminin ne yaptigini cozemedim, ama boyle calisiyor). (define (available-changes amount coins) (cond ((= amount 0) '(()) ) ; bu miktar hic para koymadan saglanabilir ((< amount 0) '() ); bu miktar saglanamaz (else (append-map (lambda (coin) (let ((avails (available-changes (- amount coin) coins))) (append-map (lambda (changes) (list (cons coin changes))) avails))) coins -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] CL ile Turkce sozcuk heceleme programi
yaklasik 6.5 kat daha hizli calisiyor, fakat hatalari bulamiyor. Sizin kod gelistirmeye daha acik gorunuyor. Mesela pardon, 3.5 olacakti -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] CL ile Turkce sozcuk heceleme programi
(defconstant +tests+ '(("cccvcc" . 5) ("cccvcv" . 4) ("cccvc" . 5) ("ccvccc" . 5) ("ccvccv" . 4) ("ccvcc" . 5) ("ccvcc" . 4) ("ccvcv" . 3) ("ccvc" . 4) ("ccvv" . 3) ("ccv" . 3) ("cvccc" . 4) ("cvccv" . 3) ("cvcc" . 4) ("cvcv" . 2) ("cvc" . 3) ("cv" . 2) ("vccc" . 3) ("vccv" . 2) ("vcc" . 3) ("vcvc" . 1) ("vcv" . 1) ("vc" . 2) ("v" . 1))) Burada hash kullanilabilir. (defun first-hyphen (word) "Determines the first hyphen of the given word due to the hyphenation tests. Returns NIL if it cannot extract the first hyphen of the word." (let ((cv-word (convert-to-cv word))) (dolist (test +tests+) (if (starts-with cv-word (car test)) (return (subseq word 0 (cdr test))) Once kelimenin tamamini cv sekline donusturulup sonra hece aransaydi daha hizli olabilir? Ben bu konuda daha once soyle bir yontem dusunmustum: pespese her iki sesli harfin arasinda hece ayrimi olmali. Aradaki sessiz harflerin sayisina göre ayrimi belirleriz. Kod soyle (sizin bazi fonksiyonlarinizi kullaniyor): (defun positions (str pred) (loop for i from 0 for elem across str when (funcall pred elem) collect i)) (defun each-subseq (seq subseq-len) (let ((count (- (length seq) subseq-len))) (loop for i from 0 to count collect (subseq seq i (+ i subseq-len) (defun bol (a b) (if (= (- b a) 2) (1+ a) (1+ (floor (+ a b) 2 (defun hyphenation-starts (str) (cons 0 (mapcar (lambda (x) (apply #'bol x)) (each-subseq (positions str #'vowel-p) 2 (defun hyphenate-2 (str) (let ((lst (append (hyphenation-starts str) (list (length str) (mapcar (lambda (x) (apply (lambda (a b) (subseq str a b)) x)) (each-subseq lst 2 Bu kod sizinkinden yaklasik 6.5 kat daha hizli calisiyor, fakat hatalari bulamiyor. Sizin kod gelistirmeye daha acik gorunuyor. Mesela cv'nin yaninda yeni harf kategorileri tanimlayip daha ozellestirilmis sekilde heceleme yapabilirsiniz. -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
[cs-lisp] Re: python lisp interpreter
Merhaba, Kodu biraz degistirdim, en iyisi link vereyim. http://studwww.ugent.be/~msoyturk/lisp.py -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
[cs-lisp] Re: python lisp interpreter
On 12/16/06, Mehmet Yavuz Selim Soyturk <[EMAIL PROTECTED]> wrote: Merhaba, http://paulgraham.com/rootsoflisp.html adresindeki dokuman yardimiyla pythonda basit bir lisp yorumlayicisi yazdim. Kendisi ektedir. Bu sefer gercekten ektedir :) -- Mehmet import string import copy ## # TOKENIZING # ## def isGood(s): lpar = 0 rpar = 0 n = 0 for (t,s) in list(tokenize(s)): if t == '(': lpar += 1 elif t == ')': rpar += 1 if rpar > lpar: return 'n' # no n += 1 if rpar < lpar or n == 1: return 'm' # more else: return 'y' # yes def atomChar(c): return not c in (string.whitespace + '()\'",`#@') def whitespace(c): return c in string.whitespace def tokenize(s): l = len(s) i = 0 while i < l: if whitespace(s[i]): i += 1 continue if s[i] in '()\',`#@': yield (s[i], s[i]) i += 1 continue if s[i] == '"': token = '"' i += 1 while s[i] != '"': token += s[i] i += 1 i += 1 yield ('s', token + '"') continue token = '' while i < l and atomChar(s[i]): token += s[i] i += 1 if token != '': yield ('a', token.upper()) else: yield ('e', None) # error yield ('$', None) # end ## # PARSING # ## def p_atom(tokens, i): sort, token = tokens[i] assert sort == 'a', sort return (i+1, token) def p_string(lst, tokens, i): sort, token = tokens[i] assert sort == 's', sort return (i+1, token) def p_lst(tokens, i): if tokens[i][0] == '(': i, lst = p_raw_list(tokens, i+1) assert tokens[i][0] == ')', tokens[i][0] return (i+1, lst) else: ops = {'\'':'QUOTE', ',':'COMMA', '@':'AT', '#':'SQUARE', '`':'BACKQUOTE'} assert tokens[i][0] in '\'`,@#', tokens[i][0] op = ops[tokens[i][0]] i, expr = p_expr(tokens, i+1) return (i, [op, expr]) def p_raw_list(tokens, i): lst = [] while tokens[i][0] != ')': i, expr = p_expr(tokens, i) lst.append(expr) return (i, lst) def p_expr(tokens, i): if tokens[i][0] in 'sa': return (i+1, tokens[i][1]) else: assert tokens[i][0] in '(\'`,@#', tokens[i][0] i, lst = p_lst(tokens, i) return (i, lst) def parse(s): tokens = list(tokenize(s)) i, expr = p_expr(tokens, 0) assert tokens[i][0] == '$', tokens[i][0] return expr def unparse(x): if type(x) == list: return '(' + ' '.join(map(unparse, x)) + ')' else: return x def doMap(x, mapp): if type(x) != list and x in mapp: return mapp[x] else: return x def isNumber(x): try: a = float(str(x)) return True except: return False def isInt(x): try: a = int(str(x)) return True except: return False #--# # EVALUATE EXPRESSI0N # #--# def res(lst, mapp): if isNumber(lst): return lst elif type(lst) != list: return mapp[lst] oper = lst[0] if oper == 'QUOTE': return lst[1] elif oper == 'ATOM': x = res(lst[1], mapp) if type(x) != list or x == []: return 'T' else: return [] elif oper == 'EQ': x = res(lst[1], mapp) y = res(lst[2], mapp) if x == [] and y == []: return 'T' elif type(x) != list and type(y) != list and x == y: return 'T' else: return [] elif oper == 'CAR': x = res(lst[1], mapp) return x[0] elif oper == 'CDR': x = res(lst[1], mapp) return x[1:] elif oper == 'CONS': x = res(lst[1], mapp) y = res(lst[2], mapp) return [x] + y elif oper == 'COND': i = 1 while i < len(lst): form = lst[i] condition = res(form[0], mapp) if condition != []: return res(form[1], mapp) i += 1 return [] return [x] + y elif oper == 'DEFUN': funName = lst[1]
[cs-lisp] python lisp interpreter
Merhaba, http://paulgraham.com/rootsoflisp.html adresindeki dokuman yardimiyla pythonda basit bir lisp yorumlayicisi yazdim. Kendisi ektedir. Basit programlar yazilabiliyor, ama su kodu calistiramadim. graham'in eval fonksiyonunda mi hata var yoksa bilmiyorum, kafam almiyor artik :) (eval '(f '(b c)) '((f (lambda (x) (cons 'a x) Selamlar. -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] Re: Rekürsif Kombinasyon Hesabı
Bu islemi tersten yapsak nasil olur? Once uygun aralikta karesi farkli rakamlardan olusan tum sayilari hesaplasak, ki cok az sayinin boyle olacagini dusunuyorum, sonra da bu sayinin a+b+c+d saklinde yazilip yazilamayacagina baksak. -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] Kombinasyon Alımı
Forcer'in koduna benziyor, fakat accumulator teknigini kullanarak tail-recursive olmasini sagladim. Biraz daha hizli olacagini tahmin ediyorum. Tabii optimizasyon az calisan bolumde oldugu icin pek de farketmiyor, hatta benim kod nedense milisaniyeler kadar da olsa yavas olma egiliminde. -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Re: [cs-lisp] Kombinasyon Alımı
Merhabalar. Problemi problemi scheme ile cozmeye calistim. Biraz sac bas yoldum, ama sonra soyle birsey ortaya cikti: (define (comb liste) (let comb-help ((lst liste) (builded '(()) )) (if (null? lst) builded (comb-help (cdr lst) (append builded (map (lambda (x) (cons (car lst) x)) builded)) Sonra diger kodlarla karsilastiridm. Forcer'in koduna benziyor, fakat accumulator teknigini kullanarak tail-recursive olmasini sagladim. Biraz daha hizli olacagini tahmin ediyorum. Ayni kodun haskell karsiligi: comb lst = comb' lst [[]] where comb' [] builded = builded comb' (x:xs) builded = comb' xs (builded ++ (map (x:) builded)) -- Mehmet ___ cs-lisp mailing list cs-lisp@cs.bilgi.edu.tr http://church.cs.bilgi.edu.tr/lcg http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp