Discussion:
Emacs - eLisp - Java - Getter/Setter metotları.
Cafer Şimşek
2007-04-05 10:25:07 UTC
Permalink
Selam,

Emacs ile daha çok Java kodu yazdığımdan sıklıkla ihtiyaç duyduğum bir
özelliği (getter/setter'ların otomatik eklenmesi) basit bir elisp
fonksiyonu şeklinde buldum[1]. Ancak bu haliyle beni tatmin etmedi
açıkçası. Her değişken için ayrı ayrı girmek zor geldi. (e)lisp bilgim
olmadığı için aynı işi istediğim gibi yapan bir Perl betiği
yazdım[2]. Ancak bunu Emacs içinden kullanabilmem için bir yöntem olup
olmadığını merak ediyorum. En basitinden aktif buffer'ı alıp yazdığım
betiğe standart girdiden gönderip, betik çıktısını da etkin
buffer'daki içerik ile değiştirebilecek bir elisp fonksiyonuna
ihitiyacım var.

Şimdiden teşekkürler.

[1] http://jspwiki.org/wiki/InsertingGettersAndSettersInEmacs
[2] http://rafb.net/p/6Q7qV065.html
--
Cafer 'cfb' Şimşek
http://cafer.org
Emre Sevinc
2007-04-05 11:57:22 UTC
Permalink
-----Original Message-----
Sent: Thursday, April 05, 2007 1:25 PM
Subject: [cs-lisp] Emacs - eLisp - Java - Getter/Settermetotları.
Selam,
Emacs ile daha çok Java kodu yazdığımdan sıklıkla ihtiyaç duyduğum bir
özelliği (getter/setter'ların otomatik eklenmesi) basit bir elisp
fonksiyonu şeklinde buldum[1]. Ancak bu haliyle beni tatmin etmedi
açıkçası. Her değişken için ayrı ayrı girmek zor geldi. (e)lisp bilgim
olmadığı için aynı işi istediğim gibi yapan bir Perl betiği
yazdım[2]. Ancak bunu Emacs içinden kullanabilmem için bir yöntem olup
Acaba JDE'yi yani Java Development Environment for Emacs'i incelediniz
mi? Istediginiz isleri JDE ile daha kolayca yapmak mÃŒmkÃŒn olabilir mi?


http://www.emacswiki.org/cgi-bin/wiki/JavaDevelopmentEnvironment

http://www-128.ibm.com/developerworks/java/library/j-emacs/
--
Emre Sevinc
Istanbul Bilgi Universitesi
Cafer Şimşek
2007-04-05 15:50:18 UTC
Permalink
"Emre Sevinc" <***@bilgi.edu.tr> writes:


[...]
Post by Emre Sevinc
Acaba JDE'yi yani Java Development Environment for Emacs'i incelediniz
mi? Istediginiz isleri JDE ile daha kolayca yapmak mümkün olabilir mi?
Evet, bunu denemiştim geçmiş zamanda ve şimdi tekrar denedim, ancak
geçmiş zamanda yaşadığım hayal kırıklığını yine yaşadım. Sonuç olarak
JDEE benim için değil. Performans olarak çok kötü, haddiden fazla
gereksiz (aslında gereksiz demeyelim de, benim kullanmadığım ve
kullanmayı düşünmediğim) özelliklerinden dolayı pek ısınamadım. Salt
Emacs ve java-mode fazlasıyla işimi görüyor aslında, tek istediğim
otomatik olarak get/set metodlarının eklenmesi veya buffer'ı herhangi
bir script'e pipe edebilmek. Bundan fazlası -en azından şimdilik- pek
lazım değil.

[...]

Sevgiler.
Post by Emre Sevinc
--
Emre Sevinc
Istanbul Bilgi Universitesi
_______________________________________________
cs-lisp mailing list
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
--
bu imza için sponsor aranıyor

Cafer 'cfb' Şimşek
http://cafer.org
Aycan iRiCAN
2007-04-05 16:12:46 UTC
Permalink
Post by Cafer Şimşek
Selam,
Emacs ile daha çok Java kodu yazdığımdan sıklıkla ihtiyaç duyduğum bir
özelliği (getter/setter'ların otomatik eklenmesi) basit bir elisp
fonksiyonu şeklinde buldum[1]. Ancak bu haliyle beni tatmin etmedi
açıkçası. Her değişken için ayrı ayrı girmek zor geldi. (e)lisp bilgim
olmadığı için aynı işi istediğim gibi yapan bir Perl betiği
yazdım[2]. Ancak bunu Emacs içinden kullanabilmem için bir yöntem olup
olmadığını merak ediyorum. En basitinden aktif buffer'ı alıp yazdığım
betiğe standart girdiden gönderip, betik çıktısını da etkin
buffer'daki içerik ile değiştirebilecek bir elisp fonksiyonuna
ihitiyacım var.
Şimdiden teşekkürler.
[1] http://jspwiki.org/wiki/InsertingGettersAndSettersInEmacs
[2] http://rafb.net/p/6Q7qV065.html
Java için tanımlanabilecek bir iskelet kullanmayı düşünür müsünüz?

CL için bir örnek yazmıştım:

(define-skeleton defclass-skeleton
"Make a class declaration"
nil
'(setq class-name (skeleton-read "Class Name:"))
Post by Cafer Şimşek
"(defclass " class-name " ()" \n
("Slot Name:" "((" str " :accessor " class-name "." str " :initarg " str "))" \n)
")")
M-x defclass-skeleton

Sevgiler...
--
Aycan iRiCAN
KOR Bilişim Teknolojileri
http://www.core.gen.tr/
Volkan YAZICI
2007-04-05 18:06:59 UTC
Permalink
Post by Cafer Şimşek
Emacs ile daha çok Java kodu yazdığımdan sıklıkla ihtiyaç duyduğum bir
özelliği (getter/setter'ların otomatik eklenmesi) basit bir elisp
fonksiyonu şeklinde buldum[1]. Ancak bu haliyle beni tatmin etmedi
açıkçası. Her değişken için ayrı ayrı girmek zor geldi. (e)lisp bilgim
olmadığı için aynı işi istediğim gibi yapan bir Perl betiği
yazdım[2]. Ancak bunu Emacs içinden kullanabilmem için bir yöntem olup
olmadığını merak ediyorum. En basitinden aktif buffer'ı alıp yazdığım
betiğe standart girdiden gönderip, betik çıktısını da etkin
buffer'daki içerik ile değiştirebilecek bir elisp fonksiyonuna
ihitiyacım var.
Bunun için şu işi yapan ufak bir fonksiyon yazabilirsiniz:

WRITE-FILE ile dosyayı[1] geçici bir yere kaydettikten sonra,
SHELL-COMMAND fonksiyonunu kullanarak[2],
"/path/to/make-getter-setter.pl <FILE>" komutunu çağırırsınız.

[1] Dosya/Buffer adını öğrenmek için BUFFER-NAME ve BUFFER-FILE-NAME
fonksiyonlarına göz atabilirsiniz.
[2] SHELL-COMMAND'ın ikinci argümanı olan OUTPUT-BUFFER seçeneğine t
değeri girerek, programın çalışması esnasında ürettiği çıktıyı şu
an bulunduğunuz imleç konumuna yazdırmasını sağlayabilirsiniz.

Ama benim daha güzel bir önerim var. Siz bize kullandığınız Perl
düzenli ifadelerinin Emacs'te çalışanlarını yollayın (Bunun için
replace-regexp ile deneme yanılma yaparak işe başlayabilirsiniz.), biz
de programınızın emacs lisp ile yazılmışını size gönderelim.

Ek olarak, programdaki trim fonksiyonuna gerek yok sanırım. Aynı işi
if ($line =~ ...) satırında da halledebilirsiniz.


İyi çalışmalar.
Volkan YAZICI
2007-04-05 22:04:51 UTC
Permalink
Post by Volkan YAZICI
Ama benim daha güzel bir önerim var. Siz bize kullandığınız Perl
düzenli ifadelerinin Emacs'te çalışanlarını yollayın (Bunun için
replace-regexp ile deneme yanılma yaparak işe başlayabilirsiniz.), biz
de programınızın emacs lisp ile yazılmışını size gönderelim.
Bi biskrem versem?

(defun make-getter-setter (type var)
(format
(concat "public %s get%s() { return %s; }\n"
"public %s set%s(%s %s) { this.%s = %s; }\n")
type var var ; getter line
type var type var var var)) ; setter line

(defun extract-class-variables (&rest modifiers)
(let ((regexp
(concat
"^\\([ \t]*\\)"
"\\(" (mapconcat (lambda (m) (format "%S" m)) modifiers "\\|") "\\)"
"\\([ \t]*\\)"
"\\([A-Za-z0-9<>]+\\)"
"\\([ \t]*\\)"
"\\([a-zA-Z0-9]+\\);$")))
(save-excursion
(goto-char (point-min))
(loop for pos = (search-forward-regexp regexp nil t)
while pos collect (let ((modifier (match-string 2))
(type (match-string 4))
(name (match-string 6)))
(list modifier type name))))))

(defun generate-class-getter-setter (&rest modifiers)
(insert
(mapconcat (lambda (var) (apply 'make-getter-setter (rest var)))
(apply 'extract-class-variables modifiers)
"\n")))

Test için (generate-class-getter-setter 'private 'public) fonksiyonunu
çağırabilirsiniz. Bundan sonra size kalan iş, bu fonksiyonu bir
kısayol tuşuna atamak. Ama bunun çözümünü bi' biskrem için bile
yapamam.


İyi çalışmalar.
Cafer Şimşek
2007-04-06 07:06:06 UTC
Permalink
Post by Volkan YAZICI
Test için (generate-class-getter-setter 'private 'public) fonksiyonunu
çağırabilirsiniz. Bundan sonra size kalan iş, bu fonksiyonu bir
kısayol tuşuna atamak. Ama bunun çözümünü bi' biskrem için bile
yapamam.
M-: (generate-class-getter-setter 'private 'public)

şeklinde denediğimde çıkan sonuçlar:

Debugger entered--Lisp error: (void-function loop)
(loop for pos = (search-forward-regexp regexp nil t) while pos collect (let (... ... ...) (list modifier type name)))
(save-excursion (goto-char (point-min)) (loop for pos = (search-forward-regexp regexp nil t) while pos collect (let ... ...)))
(let ((regexp ...)) (save-excursion (goto-char ...) (loop for pos = ... while pos collect ...)))
extract-class-variables(private public)
apply(extract-class-variables (private public))
(mapconcat (lambda (var) (apply ... ...)) (apply (quote extract-class-variables) modifiers) "\n")
(insert (mapconcat (lambda ... ...) (apply ... modifiers) "\n"))
generate-class-getter-setter(private public)
eval((generate-class-getter-setter (quote private) (quote public)))
eval-expression((generate-class-getter-setter (quote private) (quote public)) nil)
call-interactively(eval-expression)
--
ghost in the shell

Cafer 'cfb' Şimşek
http://cafer.org
Volkan YAZICI
2007-04-07 06:07:08 UTC
Permalink
Post by Cafer Şimşek
M-: (generate-class-getter-setter 'private 'public)
Debugger entered--Lisp error: (void-function loop)
Evvelinde (require 'cl) diyebilir misiniz?


İyi çalışmalar.
Cafer Şimşek
2007-04-07 09:47:48 UTC
Permalink
Post by Volkan YAZICI
Post by Cafer Şimşek
M-: (generate-class-getter-setter 'private 'public)
Debugger entered--Lisp error: (void-function loop)
Evvelinde (require 'cl) diyebilir misiniz?
Çalıştı. Yalnız, getXXX/setXXX metodlarında değişken adının ilk
harfini büyütmemesinden başka bir sorunu bulunmuyordu. Bir de
girintileme yapsın diye önceki fonksiyonlardan kopya çekerek bir kaç
küçük değişiklik yaptım sizin yazdıklarınız içinde. Son hali şu
şekilde oldu: http://rafb.net/p/HbPjVh79.html Değişkenlerin ilk
harfinin büyütülmesi işini de kopyayla hallettim :)

Tekrardan çok teşekkürler ilgilenen herkese.
Post by Volkan YAZICI
İyi çalışmalar.
[...]
--
rahmetli de spam yapardı

Cafer 'cfb' Şimşek
http://cafer.org
Volkan YAZICI
2007-04-07 10:18:28 UTC
Permalink
Post by Cafer Şimşek
Çalıştı. Yalnız, getXXX/setXXX metodlarında değişken adının ilk
harfini büyütmemesinden başka bir sorunu bulunmuyordu. Bir de
girintileme yapsın diye önceki fonksiyonlardan kopya çekerek bir kaç
küçük değişiklik yaptım sizin yazdıklarınız içinde. Son hali şu
şekilde oldu: http://rafb.net/p/HbPjVh79.html Değişkenlerin ilk
harfinin büyütülmesi işini de kopyayla hallettim :)
CAPITALIZE fonksiyonuna sadece ilgili katarı parametre olarak
vermeniz yeterli, fonksiyon sadece kelimelerin ilk harfini
büyütecektir. Dolayısı ile

(concat (capitalize (substring var 0 1)) (substring var 1))

yerine

(capitalize var)

yeterli olacaktır.


İyi çalışmalar.
Emre Sevinc
2007-04-07 11:32:27 UTC
Permalink
Post by Volkan YAZICI
Post by Cafer Şimşek
Debugger entered--Lisp error: (void-function loop)
Evvelinde (require 'cl) diyebilir misiniz?
CŞ> Çalıştı. Yalnız, getXXX/setXXX metodlarında değişken adının
CŞ> ilk harfini büyütmemesinden başka bir sorunu bulunmuyordu. Bir
CŞ> de girintileme yapsın diye önceki fonksiyonlardan kopya
CŞ> çekerek bir kaç küçük değişiklik yaptım sizin yazdıklarınız
CŞ> içinde. Son hali şu şekilde oldu:
CŞ> http://rafb.net/p/HbPjVh79.html Değişkenlerin ilk harfinin

Aklinizda bulunsun, Common Lisp ve Emacs Lisp kodunu yapistirmak,
renklendirmek, yapistirilmis koda yorum yazmak ve altina yeni kodlar
eklemek ve diger özelliklerden faydalanmak icin:

http://paste.lisp.org/

adresinden de faydalanabilirsiniz.
--
Emre Sevinc

eMBA Software Developer Actively engaged in:
http://emba.bilgi.edu.tr http://ileriseviye.org
http://www.bilgi.edu.tr http://fazlamesai.net
Cognitive Science Student http://cazci.com
http://www.cogsci.boun.edu.tr
Volkan YAZICI
2007-04-07 12:22:29 UTC
Permalink
Post by Emre Sevinc
Aklinizda bulunsun, Common Lisp ve Emacs Lisp kodunu yapistirmak,
renklendirmek, yapistirilmis koda yorum yazmak ve altina yeni kodlar
http://paste.lisp.org/
adresinden de faydalanabilirsiniz.
Aslında ben de tam tersini tavsiye etmek üzereydim fakat bu iş bana
düşmez diye şeyi şey ettirdim en son. Diyeceğim şuydu ki, işe yarar
parça kodları internette süresi dolunca silinecek sayfalara koymak
yerine direk e-posta listesine göndermek daha akıllıca olabilir. Hem
bu şekilde posta listesinde ufak bir kod arşivi toplanmış olur. (Bir
kaç KB'lik metin verisinden kimseye zarar gelmez.)

Örneğin bugün sorduğum bir soruyu rafb.net/paste'e koyarsam, 1 hafta
sonra aynı sorunun cevabını internetten arayan biri (ki bu muhtemelen
yine ben olurum) HTTP 404 hatası ile karşılaşabilir. ;-)


İyi çalışmalar.
Emre Sevinc
2007-04-07 18:24:22 UTC
Permalink
yapistirmak, renklendirmek, yapistirilmis koda yorum yazmak ve
altina yeni kodlar eklemek ve diger özelliklerden faydalanmak
http://paste.lisp.org/
adresinden de faydalanabilirsiniz.
VY> Aslında ben de tam tersini tavsiye etmek üzereydim fakat bu iş
VY> bana düşmez diye şeyi şey ettirdim en son. Diyeceğim şuydu ki,
VY> işe yarar parça kodları internette süresi dolunca silinecek
VY> sayfalara koymak yerine direk e-posta listesine göndermek daha
VY> akıllıca olabilir. Hem bu şekilde posta listesinde ufak bir
VY> kod arşivi toplanmış olur. (Bir kaç KB'lik metin verisinden
VY> kimseye zarar gelmez.)
VY> Örneğin bugün sorduğum bir soruyu rafb.net/paste'e koyarsam, 1
VY> hafta sonra aynı sorunun cevabını internetten arayan biri (ki
VY> bu muhtemelen yine ben olurum) HTTP 404 hatası ile
VY> karşılaşabilir. ;-)

E-posta listesine de bir kopyasinin yollanmasinin elbette faydasi
var ama ben simdi merak ettim baktim, paste.lisp.org adresinde 1 hafta gecer
gecmez silinmiyor gibi göründü bana, 3 yil öncesinden lisp, emacs lisp
kodlari filan var:

http://paste.lisp.org/display/3

http://paste.lisp.org/list?745

Bir de orayi sevme sebeplerimden biri, yani *bir kopya da* oraya gönderilse
fena olmaz dememin sebeplerinden biri lisp fonksiyonlari icin renklendirme
yapmakla kalmiyor ayni zamanda Hyperspec'teki (ya da Emacs kilavuzundaki)
ilgili sayfaya da otomatik link koyuyor ve tek tiklama ile detayli
aciklamaya ulasmayi kolaystiriyor olmasi.
--
Emre Sevinc

eMBA Software Developer Actively engaged in:
http://emba.bilgi.edu.tr http://ileriseviye.org
http://www.bilgi.edu.tr http://fazlamesai.net
Cognitive Science Student http://cazci.com
http://www.cogsci.boun.edu.tr
Bülent Murtezaoğlu
2007-04-05 19:48:10 UTC
Permalink
Elisp manualında 'processes' kismında birkaç örnek var. Zannediyorum
call-process-region aradığınız fonksyon.

Şöyle link vermeyi deneyeyim, belki GNUS içinden de olur (ben de
preview yapmayı bilmiyorum iyi mi?):

<info:elisp#processes>

C-h f call-process-region veya google da işinizi görür.

BM
Cafer Şimşek
2007-04-05 21:01:53 UTC
Permalink
Post by Bülent Murtezaoğlu
Elisp manualında 'processes' kismında birkaç örnek var. Zannediyorum
call-process-region aradığınız fonksyon.
Şöyle link vermeyi deneyeyim, belki GNUS içinden de olur (ben de
<info:elisp#processes>
C-h f call-process-region veya google da işinizi görür.
BM
Oraları da inceleyeceğim, teşekkürler. Ancak, şimdilik işimi
görebilecek bir şeyler çıkarttım:

(defun gen-getter-setter ()
"inserts getters/setters via perl."
(interactive)
(let ((oldpoint (point)))
(save-buffer)
(insert (shell-command-to-string (concat "~/bin/getset < " buffer-file-name)))
(c-indent-region oldpoint (point) t)
)
)

Hiç Lisp bilmeyen biri için gayet fazla bile yazdım sanırım :)

Neyse... Bir süre idare eder beni bu. Oradan buradan araklarayak bir
şeyler çıkarttım sonuçta.

[...]

Sevgiler
--
0xdeadbeef

Cafer 'cfb' Şimşek
http://cafer.org
Emre Sevinc
2007-04-05 22:12:58 UTC
Permalink
Post by Cafer Şimşek
(save-buffer)
(insert (shell-command-to-string (concat "~/bin/getset < " buffer-
file-name)))
(c-indent-region oldpoint (point) t)
)
)
Hiç Lisp bilmeyen biri için gayet fazla bile yazdım sanırım :)
Bu kadarini yapmis biri olarak bir de ~/bin/getset programinizin
icerigini bizimle paylasirsaniz Volkan'in da dedigi gibi bir elisp
bir Perl arasinda gidip gelmekten kurtarabiliriz belki sizi (birincisinin
lehinde ;-).
Post by Cafer Şimşek
--
0xdeadbeef
0xBAADF00D
0xDEADC0DE
FEEDADEADF15h
http://en.wikipedia.org/wiki/Hexspeak
--
Emre
Cafer Şimşek
2007-04-06 06:23:00 UTC
Permalink
Post by Emre Sevinc
Bu kadarini yapmis biri olarak bir de ~/bin/getset programinizin
icerigini bizimle paylasirsaniz Volkan'in da dedigi gibi bir elisp
bir Perl arasinda gidip gelmekten kurtarabiliriz belki sizi (birincisinin
lehinde ;-).
İlk mesajımda paylaşmıştım :) Yaptığım tek değişiklik parametreden
okuyacağı yerde, standart girdiden okuyacak hale getirdim.

Sevgiler.
--
Cafer 'cfb' Şimşek
http://cafer.org
Loading...