Clojurening sintaksiki Scala'dan ko'ra chindan ham oddiymi?

Har doim Clojure foydasiga qilingan argument.

Sintaksis oddiy va kodni hech qanday murakkab qoidalarsiz ifoda qilishning bitta usuli mavjud.

Shu bilan birga Scala Clojure bilan solishtirganda turli sintaksik turlari va tuzilishlarga ega.

Ammo so'nggi bir hafta ichida Clojureni o'rganishga harakat qilayotib, ichki makrolar ro'yxatining cheksiz ekanligini tushunib etdim. Garchi biz ularni bir xil parentsez sintaksisi bilan yozsak ham, ularning har bir ishini o'rganishimiz kerak.

Xo'sh, qanday ma'noda Clojurening sintaksisi soddadir? LISPers uchun bunday bo'lishi mumkin, lekin Scala'da turli xil konstruktsiyalarni o'rganadigan boshqa odamlar uchun oddiyroq ko'rinadi.

Shunday qilib, neytral nuqtai nazardan, qaysi sintaksisi oddiyroq va ukish mumkin?

8
Agar Scala standartiga nazar tashlasangiz, uning grammatikasi 7 sahifadan iborat. Scala'yı yaxshi ko'raman kabi, lisp'den ko'ra soddalashtirilgan sintaksisi yo'q.
qo'shib qo'ydi muallif jozefg, manba

5 javoblar

Shunday qilib, neytral nuqtai nazardan, qaysi sintaksisi oddiyroq va ukish mumkin?

Bu ikki juda turli xil savollar.

Simpler means "composed of fewer parts". Clojure's syntax has fewer rules, ergo it is objectively simpler than Scala's.

Readability, however, is subjective. It mainly comes down to familiarity. For example, I find ECMAScript, C#, Java, D, Go, C++ and C to be nearly incomprehensible, but for someone who is used to reading that kind of syntax, they are fairly readable. This part of the question cannot be answered objectively or "from a neutral point of view".

18
qo'shib qo'ydi
Ha, lekin savol semantik emas, sintaksis haqida edi. Agar siz buni bilishni istasangiz, savolingizni aniqroq tushuntirishingiz kerak.
qo'shib qo'ydi muallif Lawrence B. Crowell, manba
+1: Bu OP savoliga yaxshi javob. Qizig'i shundaki, ammo okulyatsiyaning butunlay sub'ektiv ekanligi umumiy mifdir. Ikki xil tilda shunga o'xshash tajribani hisobga olgan holda, bitta til boshqa statistikaga qaraganda kamroq ma'lumotli bo'lishi mumkin. (Masalan, siz ularni yaxshi bilsangiz ham, o'ta o'qimaslik degan ezoterik tillarni ko'rib chiqing.) Afsuski, men bu masala bo'yicha biror ishni bilmayman.
qo'shib qo'ydi muallif Eric H, manba
+1: "Ammo o'qiydigan narsa sub'ektivdir, u asosan tanishlikka olib keladi.": To'g'ri. Men oxirgi paytlarda Scheme va Common Lisp bilan o'ynab kelmoqdaman (men ulardan hech qanday mutaxassis emasman) va men ularning sintaksisini o'qish uchun qiyin deb hisoblayman: bunga o'rganish juda oson.
qo'shib qo'ydi muallif Giorgio, manba
@Kramii: Men C ++ bilan ko'p yillar tajribam bor va Common Lisp bilan bir necha oy tajribaga ega bo'ldim, va men C ++ dan juda ko'p ukish mumkin. Ya'ni Common Lisp ob'ektiv ravishda C ++ dan ko'ra ko'proq o'qilishi mumkin, yoki mening fikrlash uslubi CL qanday ishlashga yaqinroq ekanligini ko'rsatadi. Ehtimol, u faqat hech narsani tasdiqlamaydi.
qo'shib qo'ydi muallif Giorgio, manba
sintaksis qoidalari kamroq bo'lsa-da, keyinchalik yana o'rganish egri bir xil bo'lib qolaveradi, ammo siz turli xil konstruktsiyalarni o'rganishingiz kerak bo'lgan turli makrolarni o'rganishingiz kerak. Hatto ramzlar bilan sam-eset bilan yozilgan bo'lsa ham.
qo'shib qo'ydi muallif Amogh Talpallikar, manba
@Kramii: Siz BrainFuck kabi tillarga murojaat qildingizmi?
qo'shib qo'ydi muallif Amogh Talpallikar, manba

Scala'da ishlaganimda, ko'pincha mening rivojlanish bosqichi (ayniqsa, for tushuntirishlari bilan) mavjud bo'lib, unda hamma turlarni to'g'ri ishlashga to'g'ri keladi, bu katta loyihalar uchun katta hajmdagi qo'shimcha hisoblanadi, kichiklar uchun salbiy. Men Clojureda "ishni bajarish" ni unutishim mumkinligini va Perl yoki Awk-da qilayotganimni eslashimga umid qilardim, ammo hozirgacha bu usulni men uchun ishlab chiqmagan. Mening tajribam kod/kompilyatsiya bosqichida "ishlarni bajarish" ni amalga oshirish o'rniga kodni ishlatishga harakat qilganda istisnolardan foydalanaman. Bu soddalashtirish emas; muammoni bartaraf etmasdan, u rivojlanish siklining yanada xavfli/qimmatbaho qismiga o'tadi.

U erda Lisp-ish sintaksisiga yoqimli soddalik. Emacsning kuchli tomonlaridan biri har qanday tamponda kod bloklaridagi yopiq parenstanda maxsus kalitlarni ketma-ketlik bilan urib, o'zboshimchalik bilan lisp kodini bajarishga qodir. Litsp sintaksisidagi oddiy parentezli tabiat bu juda oqilona bo'lib, ko'plab boshqa tillarda noqulay (bukri brauzerlarni kiritish kerakmi?) Bundan tashqari, (funktsiya arg, arg ...) va (operator arg, arg ...) muntazamligi funktsiyalar va operatorlar haqida birinchi toifali fuqarolar va Scala kabi boshqa tillarning infix-operatorlari ham xuddi shunday tarzda anonim funksiyalar haqida o'ylash juda tabiiy.

Scala bilan cheklangan tajribam menga sintaksikning oddiy yoki ko'p o'qilishi mumkinligini aytishga xalaqit beradi. Albatta, Clojure-da makroslardan foydalangan holda ba'zi lisonlarsiz sintaksisi mavjud, lekin mening tushuncham shuki, bu makrolar boshqa funksiyalarga ega bo'lgan sintaksidada faqatgina kichik oynani ochadi. Tilda funktsional yoki imperativ sintaksisga ega bo'lishni afzal ko'rish narsalarni soddalashtirishi mumkin. Buning uchun Clojure, Java va Haskellga nuqta berishim kerak edi.

Scala bilan bog'liq muammo mening C ++ yoki Perl bilan bir xil tashvish (kamroq darajada bo'lsa-da); tilning sintaksisi turli xil fikrlash uslublarini qamrab oladi (Haskell va Java). Bu yozishni qiziqarli qiladi, ammo okunabilirlik uchun muammo bo'lishi mumkin. Hatto yozganimdek, Clojure domenga xos tillarni qo'llab-quvvatlaydi va mening fikrimni qanchalik zaiflashtirayotganiga hayron qoldim.

Sizning savolingiz juda qiziqarli. Natijada, taqqoslash murakkabdir. Lekin mening hozirgi bilimim asosida, Clojurening sintaksisi Scala'dan ko'ra oddiyroq ekaniga rozi bo'lishimga to'g'ri keladi, ammo ehtimol, bu kattaligi oddiy tartib emas.

4
qo'shib qo'ydi

Biz ularni bir xil parentsez sintaksisi bilan yozsak ham

Va bu asosan sizning savolingizga javob.

har bir ishni qanday o'rganishimiz kerak.

DSL-larni oddiy makroslar yordamida (shu bilan o'quvchi makrosini chiqarib tashlayman) Common Lisps kodi (loop) kodi bilan kodlash sintaksisi bilan tanishtirish mumkin bo'lsa-da, ularni asosan baholashni nazorat qilish uchun foydalaniladi va muntazam s-ifoda sintaksisini ishlatish. Muhim xususiyatlardan biri shundaki, yanada murakkab pastadir -like makroları bir xil eski sexpr o'quvchidan foydalanib o'qilishi mumkin.

Turli xil makrolar va kirish usullari haqida bilib olishingiz kerak bo'lsa-da, Common Lisp-ning cond -ga qaraganda, Clojure ning cond

Yangi funksiyalarga duch kelganingizda, o'rganishingiz kerak bo'lgan ba'zi API bo'ladi. Bundan tashqari, faqatgina funktsiyasi (arg1, arg2, ..., argN) sintaksisiga ruxsat bergan tilni saqlab qoladi - siz hali ham kutilgan argumentlar nima ekanligini, qanday yon effektlar paydo bo'lishini va nima har qanday funksiyaning chiqishi.

Scale kabi bir til bilan taqqoslaganda Lisp sintaksisi haqida nima deyish mumkin, har bir narsa vakili kamroq yoki bir xil emasligini, shuningdek, bu kodning o'zi bu ma'lumotlar va ma'lumotlar tuzilmalarini (bu homoikoniklik har bir kishi haqida gapiradi). Agar Lisp yoki Clojure sintaksik tahlilchisi va keyinchalik Scala parserini yozishga harakat qilsangiz, bu sintaktik murakkablikdagi farq juda aniq bo'ladi. Siz juda murakkab grammatikani engishingiz kerak bo'ladi - ustunlik, bo'sh joy, noaniqliklar, ko'proq istisno va hokazolar haqida murakkabroq qoidalar.

3
qo'shib qo'ydi

Vikipediya aniqlash :

Kompyuter fanida dasturlash tilining sintaksisi - bu set   qabul qilingan belgilar kombinatsiyasini belgilaydigan qoidalar   ushbu tilda to'g'ri tuzilgan dasturlar bo'lishi kerak.

Clojure bir lisp bo'lsa, sizning so'zlaringizga + o'quvchi makroslari a> va bu hammasi.

Skalada sizda sinflar, kaskadli sinflar, yopiq lambda, yopiq kalit so'zlar, xususiyatlar, umumiy izohlar, variance annotatsiyasi va boshqalar mavjud.

Clojure'da oddiy sintaksis mavjud, chunki xususiyatlar makrolar yoki maxsus shakllar sifatida qo'llanilishi mumkin. Bu skala bilan amalga oshirilishi mumkin emas, uning ba'zi xususiyatlarini qo'llab-quvvatlash uchun sintaksisini kiritish kerak.

3
qo'shib qo'ydi

Makroslar sintaksis emas.

Ekotizimni yoki asosiy kutubxona murakkabligini bahslash butunlay boshqa bir munozarasi.

1
qo'shib qo'ydi