Perbedaan antara (loop for) dan (loop :for) di Common Lisp [duplikat]

Saya baru saja melihat jawaban Sylwester untuk pertanyaan ini, dan menurut saya aneh loop memiliki titik dua di mana-mana.

Biasanya, saya akan menulis

(loop for n below 10 do (princ n) (terpri))

alih-alih

(loop :for n :below 10 :do (princ n) (terpri))

Setelah beberapa pengujian, saya melihat bahwa dengan loop pertama, simbol for, below dan do kemudian menjadi bagian dari cl-user (edit : sebenarnya bukan do, hanya dua lainnya, mungkin karena do juga makro dalam paket cl), bukan dengan yang kedua. Demikian pula, 'X saja akan menjadi bagian dari cl-user, bukan ':X. Fungsi symbol-package memberi tahu saya bahwa yang terakhir ada dalam paket kata kunci.

Sekarang, loop pertama, tanpa titik dua, terlihat jauh lebih cantik bagi saya, jadi saya ingin tahu apakah pernyataan sebelumnya merupakan alasan yang baik untuk menggunakan loop kedua. Bahwa simbol-simbol tersebut menjadi "termasuk" dalam paket saat ini terlihat tidak menyinggung, tapi mungkin saya telah mengabaikan konsekuensinya.

Ada ide?


person Community    schedule 13.02.2015    source sumber
comment
@Sylwester Ya, pasti duplikat.   -  person    schedule 13.02.2015
comment
Saya kira saya melakukannya untuk membedakan kata kunci loop dari variabel/ekspresi. (loop :for element :below below-average :counting (> element above-average)) lebih mudah dibaca dengan benar daripada (loop for element below below-average counting (> element above-average))   -  person Sylwester    schedule 13.02.2015
comment
@Sylwester Ya, dan dengan pewarnaan sintaksis terlihat jauh lebih baik. Saya akan mencobanya.   -  person    schedule 13.02.2015


Jawaban (2)


Anda sebagian besar sudah menjawab pertanyaan Anda sendiri, perbedaannya seperti yang Anda jelaskan. :some-symbol akan berada dalam paket :KEYWORD, dan 'SOME-SYMBOL akan berada dalam paket Anda saat ini CL-USER secara default. Di loop makro itu hanya masalah selera. Beberapa orang lebih suka menggunakan notasi :for untuk mendapatkan penyorotan sintaksis yang lebih baik di editor teks mereka, misalnya.

person coredump    schedule 13.02.2015
comment
Terima kasih. Saya tidak mengetahui pilihan ini sebelumnya. - person ; 13.02.2015
comment
Anda juga dapat menggunakan simbol di paket lain, bukan hanya paket saat ini atau paket kata kunci. Jawaban ini akan ditingkatkan dengan referensi mengapa ini diperbolehkan, menurut saya. (Tidak terlalu sulit untuk mengetahui apa yang terjadi, namun tanpa referensi, sulit untuk mengetahui apakah ini bug atau perilaku yang disengaja. (Saya tahu ini memang disengaja.)) - person Joshua Taylor; 13.02.2015

CL-USER 23 > (find-symbol "LOOP" "CL")
LOOP
:EXTERNAL

CL-USER 24 > (find-symbol "FOR" "CL")
NIL
NIL

LOOP adalah simbol dalam paket COMMON-LISP dan diekspor. FOR bukan keduanya. Jadi dalam setiap paket yang tidak mempunyai simbol FOR dan tidak mewarisi simbol tersebut, seseorang akan menambahkan simbol tersebut ketika menulis perulangan LOOP FOR.

Itu dia. Biasanya itu seharusnya tidak menjadi masalah...

person Rainer Joswig    schedule 13.02.2015