Bahasa pengaturcaraan skema. Bahasa pengaturcaraan skema. Senarai pendek pelaksanaan Litar yang paling terkenal

pengenalan

Semasa membangunkan Skim, penekanan diberikan kepada keanggunan dan kesederhanaan bahasa. Falsafah bahasa itu sangat minimalis. Matlamatnya bukan untuk menggabungkan pelbagai binaan dan alatan yang berguna, tetapi, sebaliknya, untuk menghapuskan kelemahan dan batasan yang memerlukan penambahan ciri baharu pada bahasa tersebut. Hasilnya, Skim mengandungi minimum binaan primitif dan membolehkan anda menyatakan apa sahaja yang anda inginkan dengan membinanya. Sebagai contoh, kita boleh menunjukkan bahawa bahasa menggunakan 2 mekanisme untuk mengatur gelung:

  1. rekursi "sisa" atau "ekor". rekursi ekor)
  2. pendekatan berulang (yang menggunakan pembolehubah sementara untuk menyimpan hasil perantaraan).

Skim ialah dialek Lisp pertama yang menggunakan skop pembolehubah statik (bukan dinamik) secara eksklusif, memastikan pengoptimuman pengulangan ekor dan menyokong jenis data Boolean (#t dan #f dan bukannya T dan NIL yang janggal). Ia juga merupakan salah satu bahasa pertama yang menyokong secara langsung sambungan(Bahasa Inggeris) sambungan). Sejak spesifikasi R^5RS, bahasa ini telah memperoleh cara yang sangat berkuasa dan mudah untuk menulis makro berdasarkan corak transformasi sintaksis dengan cara "kebersihan". hygienic_macro). Skim juga melaksanakan "kutipan sampah". kutipan sampah), iaitu, pelepasan automatik memori daripada objek yang tidak lagi digunakan.

Bahasa ini menggunakan senarai dan tatasusunan satu dimensi (“vektor”) sebagai struktur data asas. Selaras dengan minimalisme yang diisytiharkan, (belum ada) sintaks standard untuk menyokong struktur dengan medan bernama, serta alat OOP - semua ini boleh dilaksanakan oleh pengaturcara mengikut keutamaannya, walaupun kebanyakan pelaksanaan bahasa menawarkan mekanisme siap pakai. .

Sebagai rasa ingin tahu, boleh diperhatikan bahawa nama asal bahasa Schemer telah ditukar kepada yang sekarang kerana sekatan pada masa itu pada panjang nama fail dalam ITS.

Contoh

Operasi Matematik Mudah

(+ 2 (* 2 2 ) ) (+ 1 2 3 4 )

Setiap panggilan operasi (atau fungsi) diwakili sebagai senarai, di mana simbol operasi (yang pada asasnya adalah nama fungsi) sentiasa menduduki kedudukan permulaan.

Jenis predikat

(nombor? 5 ) (nombor? "foo") (rentetan ? "foo")

Mengikut konvensyen, nama semua predikat berakhir dengan simbol? .

Pemeriksaan kesaksamaan

(eq? "foo" "bar" ) (eq? 5 (+ 2 3 ) ) (eq? (eq? 2 3 ) (eq? 3 4 ) )

Menentukan makro untuk operasi tolak/pop tradisional

(tekan takrif-sintaks! (peraturan-sintaks () ((tekan! x l ) (set! l (kontra x l ) ) ) ) (tentukan-sintaks pop! (peraturan-sintaks () ((pop! l ) (biarkan ( (x (kereta l ) ) ) (set! l (cdr l ) ) x) ) ) )

Mentakrifkan Fungsi

;; faktorial dalam (tidak cekap) gaya rekursif(takrifkan (fakta x) (jika (< x 3 ) x (* (fact (- x 1 ) ) x) ) ) ;; Fungsi Fibonacci - memerlukan pengulangan berganda(takrifkan (fib n) (cond ((= n 0 ) 0 ) ((= n 1 ) 1 ) (lain (+ (fib (- n 1 ) ) (fib (- n 2 ) ) ) ) ) ;; jumlah elemen senarai dalam gaya Skim biasa ;; (bantuan fungsi gelung menyatakan gelung menggunakan ;; rekursi ekor dan pembolehubah penumpuk)(takrifkan (senarai-jumlah x) (gelung biarkan ((x x) (n 0 ) ) (jika (null? x) n (gelung (cdr x) (+ (kereta x) n) ) ) ) ) (fakta 14) (fib 10 ) (jumlah "(6 6 6 100 ) ) (jumlah (fib peta "(1 2 3 4 ) ) )

Definisi fungsi mesti mematuhi prototaip berikut:

(takrifkan nama_fungsi (lambda (senarai_argumen) (pelaksanaan_fungsi) ) ),

walaupun dalam praktiknya bentuk yang disingkatkan lebih kerap digunakan:

(takrifkan (argumen nama_fungsi) (pelaksanaan_fungsi) ) .

Input Output

(tulis (+ (baca) (baca)))

Pautan

Pautan bahasa Rusia

pautan bahasa Inggeris

Buku teks dalam bahasa Inggeris

  • Kuliah video "Struktur dan Tafsiran Program Komputer", Harold Abelson dan Gerald Jay Sussman
  • Bahasa Pengaturcaraan Skim, R. Kent Dybvig

Yayasan Wikimedia. 2010.

Lihat apa "Skim (bahasa pengaturcaraan)" dalam kamus lain:

    Bahasa pengaturcaraan ialah sistem tanda formal yang direka untuk menulis program komputer. Bahasa pengaturcaraan mentakrifkan satu set peraturan leksikal, sintaksis dan semantik yang mentakrifkan penampilan program dan tindakan,... ... Wikipedia

Ken Dickey (terjemahan oleh Alexey Desyatnik)

Pandangan alternatif tentang dunia

Setiap bahasa pengaturcaraan mewakili pandangan dunia tertentu dari segi perkara yang dibenarkan (atau tidak dibenarkan) untuk digunakan. Siri artikel ini menerangkan pandangan dunia bahasa pengaturcaraan Skema ("Pandangan Dunia Skema"). Pandangan dunia ini mengandungi banyak elemen pengaturcaraan moden: sokongan untuk pelbagai paradigma pengaturcaraan, mudah digabungkan, abstraksi boleh digunakan semula, keupayaan untuk mencipta bahasa yang "disesuaikan" untuk aplikasi tertentu, perbezaan yang jelas antara bahagian mudah alih dan bukan mudah alih program, kebolehskalaan, daripada utiliti individu kepada sistem perisian yang paling serius.

Skim ini bermula sebagai percubaan dalam pembangunan bahasa pengaturcaraan untuk menguji beberapa prinsip asas dalam teori pembangunan program. Kini ia menerima bantuan daripada banyak universiti terkenal (seperti MIT - Massachusetts Institute of Technology) sebagai bahasa pengaturcaraan pertama yang dipelajari. Selain itu, Litar digunakan dalam industri oleh syarikat seperti DEC, Texas Instruments, Tektronix, Hewlett Packard, dan Sun.

Apakah Skim?

Skema ialah bahasa yang kecil dan sangat bersih yang (paling penting!) menyeronokkan untuk digunakan. Skim ini direka bentuk sedemikian rupa sehingga sebilangan kecil binaan universal boleh digunakan dengan mudah dalam gaya pengaturcaraan yang berbeza: berfungsi, berorientasikan objek dan imperatif. Standard bahasa hanya mengambil masa kira-kira 50 (!) halaman, termasuk definisi formal semantik. Skim ini berdasarkan model pengiraan lambda formal, jadi ia penuh dengan ciri yang sesuai untuk ahli teori; ini menjadikannya agak mudah untuk membina alat pembangunan perisian pintar.

Skema ini mempunyai mekanisme skop leksikal, peraturan pengiraan seragam, dan pemahaman seragam jenis data. Skema ini tidak mempunyai konsep penuding, pembolehubah tidak dimulakan, binaan gelung khas atau kawalan storan halus.

Apakah rupa Skim tersebut? Nah, ia kelihatan seperti Lisp. Jangan biarkan ini menakutkan anda: penampilan Skim boleh diubah (dan kami akan melakukan ini pada masa hadapan). Apa yang penting ialah konsep di sebalik Rangka Tindakan dan cara anda boleh menggunakannya. Jadi, mari kita bandingkan Skim dan beberapa bahasa pengaturcaraan "klasik" - katakan, C. Anda mungkin sudah tahu bahawa Skim menggunakan tatatanda awalan, berbanding dengan tatatanda infiks C:

Skim

Si

(+ 2 3 4)

(2 + 3 + 4)

(< low x high)

((rendah< x) && (x < high))

(+ (* 2 3) (* 4 5))

((2 * 3) + (4 * 5))

(f x y)

f(x, y)

(takrifkan (petak x) (* x x))

int segi empat sama(int x)

kembali (x * x)

Dalam Skema, semua jenis data adalah setara. Apa-apa sahaja yang boleh dilakukan dengan satu jenis data boleh dilakukan dengan semua yang lain. Ini sangat berbeza dengan kebanyakan bahasa pengaturcaraan, yang mempunyai operasi khas untuk beberapa jenis data dan secara khusus mengehadkan penggunaan beberapa jenis data lain. Dalam kebanyakan bahasa, contohnya, nombor mempunyai hak istimewa: ia boleh digunakan tanpa memberi mereka nama (bayangkan, sebagai contoh, dalam BASIC setiap nombor perlu diberi nama sebelum ia boleh digunakan!). Fungsi, sebaliknya, adalah terhad: mereka mesti mempunyai nama.

Dalam Skema, fungsi tanpa nama dibuat menggunakan kata kunci lambda:

(kambing domba a(x)(* x x)); hasilnya adalah fungsi!

(takrif sq(lambda(x)(*xx))

(persepuluh 9); 27

((lambda (x) (* x x)) 9) ; 27

((jika (foo? x) * +) 2 3 4) ; jika (foo? x) benar,

; kemudian (* 2 3 4),

; jika tidak (+ 2 3 4)

(takrifkan (kari-tambah x) (lambda (y) (+ x y))

(takrifkan tambah3 (kari-tambah 3)); tambah3- fungsi

(tambah3 7); 10

((Kari-tambah 3) 7); 10

Detik asas:

Pembolehubah boleh mengandungi nilai apa-apa jenis;

Nama menunjukkan makna; nama adalah pilihan;

Ungkapan – satu atau lebih bentuk antara kurungan;

Untuk menilai ungkapan, anda mesti terlebih dahulu menilai nilai semua bentuk antara kurungan, dan kemudian menggunakan nilai bentuk pertama kepada semua yang lain; ungkapan bersarang juga dianggap sebagai bentuk;

Komen bermula dengan koma bertitik (;) dan terus ke penghujung baris;

Apabila fungsi dinilai, ia "mengingat" keadaan "persekitaran" di mana ia dicipta (jadi tambah 3 ingat bahawa X adalah sama dengan tiga pada masa ia dicipta, iaitu pada masa ungkapan itu dinilai ( lambda ( y) (+ xy)) 7) ).

( tentukan ( persegix) (* xx)) hanyalah satu lagi bentuk penulisan ungkapan

(takrif sq(lambda(x)(*xx))

Terdapat tujuh jenis ungkapan yang mungkin:

Pemalar: "foo#\Z3”rentetan”

Rujukan boleh ubah: foojoea- panjang- nama@#$!+-*/%<>

Mencipta fungsi: ( lambda ( z) (* zzz))

Prosedur permohonan: ( kiub 37)

keadaan: (jika (< x 3) sqrt modulo)

Menetapkan nilai: ( ditetapkan! x 5)

Susulan: ( bermula ( menulisx) ( menulisy) ( baris baru))

(Sudah tentu, senarai ini tidak termasuk semua pilihan ungkapan)

Skema mempunyai set jenis data biasa:

Huruf (watak): #\a #\A \#space #\baris baharu

Rentetan: "baris teks"

Tatasusunan (vektor): #(1 2 ”baris” #\x 5)

Senarai: (sedikit (senarai) (senarai))

Nombor: 47 1/3 2.3 4.3e14 1+3i

Fungsi

Nilai Boolean (masing-masing boolean, benar dan palsu): # t # f

Pelabuhan (cth buka fail atau sambungan rangkaian)

Simbol (simbol, biasanya digunakan untuk menunjukkan pembolehubah): ini- ialah- a- simbolfooa32 > adfasf23@#$%!<

Detik asas:

Vektor boleh terdiri daripada sebarang objek data;

Simbol boleh mengandungi huruf abjad Inggeris, nombor dan huruf + - . * / < = > ! ? : $ % _& ~ ^

Simbol tidak sensitif huruf besar-besaran (iaitu SYMBOL dan SyMboL adalah sama)

Simbol digunakan untuk mewakili pembolehubah (tetapi bukan itu sahaja!)

Mengikut konvensyen (hanya untuk kemudahan), predikat (ungkapan penyemakan nilai) berakhir dengan tanda soal, dan fungsi "berbahaya" (menukar nilai pembolehubah) berakhir dengan tanda seru

Nombor amat menarik dalam Skim: setiap integer ialah pecahan, pecahan ialah nombor nyata dan nombor nyata adalah kompleks. Nombor dikelaskan berdasarkan ketepatan (tepat atau anggaran - tepat / tidak tepat):

(tepat? 3); #t

(tepat? 1/3); #t

(tepat? 2.3##); #f

(+ 2/3 1/2 5/6); 2

(integer? 2); #t

(integer? 3/7); #f

(sebenar? 2); #t

Falsafah Skim

Salah satu ciri bagus Skim, yang pada mulanya mengelirukan ramai orang, ialah kekurangan sekatan. Skim ini sangat ekspresif: seorang pengaturcara boleh "mengatakan" satu pemikiran (tindakan) dalam bahasa ini dengan cara yang sama sekali berbeza. Dalam Skim, pengaturcara mempunyai kebebasan-dan tanggungjawab-untuk "mengatakan" tepat seperti yang dia mahu. Dalam banyak bahasa pengaturcaraan lain, kadangkala anda perlu mencari beberapa jenis "penyelesaian" untuk mendapatkan apa yang anda perlukan daripada mereka, tetapi dalam Skim ini tidak diperlukan.

Untuk memanaskan badan, mari bina struktur data pasangan. Sepasang terdiri daripada dua elemen yang diperoleh menggunakan fungsi akses PERTAMA dan KEDUA (masing-masing PERTAMA dan KEDUA). Fungsi berpasangan akan dipanggil PAIR. Hubungan berikut mesti dipenuhi: ( pertama ( sepasang 1 2)) sama dengan 1, ( kedua ( sepasang 1 2)) sama dengan 2. Bagi mereka yang mengenali Lisp, ini bukanlah sesuatu yang luar biasa. Walau bagaimanapun, dalam berapa banyak cara yang berbeza kita boleh melaksanakan trio ini: PASANG, PERTAMA, KEDUA?

; 1. Vektor

; ia mungkin dan mudah (takrifkan vektor PAIR) , tetapi ia lebih baik dari segi gaya

(takrifkan (PAIR a b) (vektor a b))

(takrifkan (FIRSTaPair) (vektor-ref aPair 0))

(takrifkan (aPair KEDUA) (vector-ref aPair 1))

; 2. Fungsi pemilihan

; Jangan lupa tentang skop leksikal:

; setiap fungsi yang dicipta oleh fungsi PAIR akan ingat

; nilai a dan b pada masa penciptaan

(takrifkan (PASANGAN a b) (lambda (bool) (jika bool a b)))

(takrifkan (FIRSTaPair) (aPair #t))

(takrifkan (pasangan KEDUA) (pasangan #f))

; 3. Pemesejan

(takrifkan(PASANGAN(a b))

(lambda (msg)

(case msg ; case construct bagi setiap nilai msg

; membuat persembahan sesuai tindakan

((pertama )a ); jika mesej itu adalah simbol pertama,

; kembali a

((kedua) b))))

; Tanda kutip (‘) sebelum simbol menghalang nilainya daripada dikira

; (tanpa itu akan ada ralat "pembolehubah hilang")

(takrifkan (FIRSTaPair) (aPair 'first))

(takrifkan (SeconD aPair) (aPair 'second))

; 4. Alias: Sudah terdapat jenis data "pasangan" dalam Skema!

(takrifkan PAIRcons)

(takrifkan FIRSTcar)

(takrifkan cdr KEDUA)

; 5. Fungsi Lambda (menyalurkan fungsi sebagai parameter kepada orang lain

; fungsi)

(takrifkan (PAIR a b) (lambda (proc) (proc a b)))

(takrifkan (FIRSTaPair) (aPair (lambda (x y) x)))

(takrifkan (pasangan KEDUA) (sepasang (lambda (x y) y)))

Inti dari semua perkara di atas: walaupun perkara yang paling mudah boleh dilakukan dengan cara yang sama sekali berbeza.

Sekarang setelah kita memanaskan badan, mari kita lihat faktorial lama yang baik (peringatan: faktorial ialah hasil darab semua integer daripada 1 hingga nombor tertentu).

Pertama, definisi rekursif:

(takrifkan (fakta n)

(jika (< n 2)

(*n(fakta(-n1)))

Apabila saya (Ken Dickey) mula-mula mempelajari definisi rekursif seperti ini, bahagian yang paling sukar ialah memahami bagaimana keadaan tersembunyi sesuatu fungsi disimpan pada timbunan. Transformasi kod kecil menjadikan timbunan kelihatan.

; fungsi identiti hanya mengembalikan hujahnya

(takrifkan (nilai identiti) nilai)

; simpan bentuk fungsi fakta

; (kini ia hanya memanggil fungsi cfact)

(takrifkan (fakta n) (cfakta n identiti))

; Dan fungsi cfact – mengira faktorial

(takrifkan (cfact n k)

(jika (< n 2)

(k 1)

(cfakta(-n 1)

(lambda (hasil) (k (* n hasil))))))

Fungsi cfact ialah versi fungsi fakta yang menggunakan sambungan. Daripada mengembalikan hasil, setiap kali fungsi menerima hujah tambahan, "sambungan", yang dipanggil dengan hasil pengiraan fungsi.

Mari lihat bagaimana panggilan itu akan berubah ( fakta 3) :

(fakta 3) menjadi (cfakta 3 identiti)

(cfakta 3 identiti) menjadi

(cfakta 2

(lambda(hasil)

(identiti (* 3 keputusan)))); k'

Ini pula ditukar menjadi

(cfakta 1

(lambda (hasil’) ;; k’’

((lambda (hasil)

(identiti (* 3 hasil))); fungsi k"

(* 2 hasil ')); hujah diluluskan k"

((lambda (hasil’) ;; k’’

((lambda (hasil)

(identiti (* 3 hasil)))(* 2 hasil’))

) 1)

((lambda (hasil) (identiti (* 3 hasil))) (* 2 1))

(identiti (* 3 (* 2 1)))

(* 3 (* 2 1))

-> 6

Ini bukan contoh bagaimana perkara yang sangat kompleks boleh dibuat dengan mudah daripada perkara yang mudah. Mengapa kami melakukan ini? Intinya ialah kita boleh mengawal apa yang biasanya tersembunyi pada timbunan. Ini membolehkan anda melakukan beberapa perkara yang menarik. Kita boleh mengabaikan satu "sambungan" dan sebaliknya menggunakan yang lain. Kita boleh mengawal, sebagai contoh, pengiraan jangka panjang. Jika ia mengambil masa lebih lama daripada yang dijangkakan, kami boleh menyimpan kesinambungan kami (“di mana kita sekarang”) dan mencuba pendekatan yang berbeza untuk menyelesaikan masalah. Jika pilihan baharu lebih teruk, kita boleh kembali ke "sambungan" yang disimpan dan meneruskan pengiraan. Sudah tentu, kita boleh menyimpan percubaan kita untuk melakukan yang lebih baik sekiranya ia benar-benar menjadi lebih baik...

Oleh itu, penggunaan "sambungan" membolehkan anda membina struktur kawalan yang sangat menarik dan fleksibel. Sekarang mari kita lihat faktorial dari sisi lain. Setiap panggilan rekursif hanya meletakkan satu lagi pengganda pada timbunan. Tetapi kami mungkin tidak menggunakan timbunan jika kami memperkenalkan pembolehubah "akumulator" tambahan. Sudah tentu, sebelum memulakan pengiraan, penumpuk mestilah sama dengan 1 (sejak x *1 = x ).

(takrifkan (fakta n)

; tentukan fungsi untuk mengira faktorial dengan penumpuk

(takrifkan (cfact _n acc)

(jika (< _n 2)

(cfakta (- _n 1) (* _n acc))

; panggil fungsi ini dengan penumpuk sama dengan 1

(cfak n 1)

Pada permukaan fungsi ini nampaknya rekursif. Walau bagaimanapun, ia tidak. Skim ini mempunyai konsep "rekursi ekor", yang menjadikan gelung biasa tidak diperlukan. Setiap fungsi yang memanggil dirinya dalam kedudukan "ekor" (iaitu sebagai tindakan terakhir) hanyalah gelung.

Jadi kami menukar agama fungsi rekursif menjadi berulang, kitaran. Terdapat cara formal (secara teorinya "betul") untuk melakukan ini; tetapi satu ciri bagus Skim ini ialah transformasi ini mudah dan intuitif. Program yang berfungsi dengan betul boleh ditulis dengan cepat, walaupun ia mungkin perlahan dan intensif memori pada mulanya. Selepas menyahpepijat algoritma, mudah untuk mengubahnya menjadi algoritma yang lebih cekap - dan juga berfungsi dengan betul! Menukar program menjadi sifat kedua kepada pengaturcara Skim yang berpengalaman.

Skim ini mempunyai beberapa kelebihan penting berbanding bahasa lain. Strukturnya yang ringkas, seragam dan sintaks remeh mengelakkan perbezaan " majlis-majlis khas" Ekspresinya membolehkan anda mengelak daripada membuang masa mencari penyelesaian: pengaturcara boleh menumpukan perhatian pada perkara yang Apa dia perlu melakukannya, tetapi bukan pada itu Bagaimana lakukannya. Skim menyokong beberapa gaya pengaturcaraan, termasuk gaya berorientasikan objek yang kini bergaya, jadi pengaturcara tidak perlu menyesuaikan diri dengan Skim; dia boleh menggunakan gaya atau cara menyelesaikan masalah yang biasa dia lakukan. Formaliti Skim menjadikan pembuktian ketepatan program lebih mudah. Alat abstraksi yang berkuasa membolehkan anda mengasingkan bahagian program yang boleh digunakan semula daripada bahagian yang disesuaikan dengan masalah/pelaksanaan bahasa/sistem pengendalian tertentu. Kemudahan untuk menggabungkan fungsi yang berbeza dan mencipta reka bentuk baharu berdasarkannya membolehkan anda mencipta keseluruhan perpustakaan komponen universal yang ditala dengan baik.

Dalam erti kata lain, jika anda ingin menulis program yang kompleks dan betul, tetapi tidak mahu menghabiskan masa bertahun-tahun di atasnya, Skim adalah perkara yang anda perlukan untuk berjaya!

Senarai pendek pelaksanaan Skim yang paling terkenal.

Chez Scheme dan MacScheme ialah beberapa pelaksanaan komersial terbaik; namun, terdapat banyak penterjemah dan penyusun Skema percuma untuk tujuan pendidikan dan kerja serius.

Satu daripada sistem terbaik untuk Windows dan Linux - MzScheme, dan MrEd dibina berdasarkannya (sistem untuk mencipta mudah alih GUI pengguna) dan DrScheme (mungkin persekitaran pembangunan program yang paling mudah wujud).

pengenalan

Skim- bahasa pengaturcaraan berfungsi, salah satu daripada dua dialek bahasa yang paling terkenal pada zaman kita Lisp. Lelaki L. Steele Dan Gerald Jay Sussman daripada Institut Teknologi Massachusetts ( MIT) - menciptanya pada pertengahan 1970-an. Tepat sekali Skim telah lama digunakan dalam MIT untuk mengajar pengaturcaraan (kini digantikan dengan Ular sawa) dan tepat pada Skim contoh ditulis dalam buku terkenal "Struktur dan tafsiran program komputer"- bible setiap pengaturcara yang menghormati diri sendiri.

Untuk IDE Gerhana Terdapat pemalam yang membolehkan anda memprogramkan Skim. Dalam artikel ini kita akan melihat ciri utama pemalam ini, mengkaji proses menggunakannya dan prosedur konfigurasi.

Pemalam itu dipanggil Skrip Skema dan merupakan sebahagian daripada projek itu SkimCara. Anda boleh memuat turun versi terkini pemalam ini dari tapak web (selepas memuat turun, hanya salin fail jar kepada katalog gerhana/pemalam). Projek ini sedang berkembang secara aktif, versi terkini dipanggil 1.3.0 alpha10 dan dikeluarkan pada 05/09/2010. Kod sumber boleh didapati di GitHub . Maklumat tambahan tentang pemalam, beberapa helah yang dibenarkan Skrip Skema, dan keupayaannya boleh didapati dalam blog Dominique Boucher- pengarang sambungan ini.

Perlu diingat bahawa walaupun versi terkini Skrip Skema tidak berfungsi Eclipse Helios, jadi buat masa ini untuk pembangunan dalam bahasa Skim sepatutnya digunakan Eclipse Galileo.

UPD 17/07/10: Versi terkini pada GitHub berfungsi Eclipse Helios, tetapi ia perlu disusun daripada sumber. Selepas beberapa lama, Dominic berjanji untuk membina semula pengedaran.

Gerhana-perspektif Skim

Selepas memasang pemalam ia akan tersedia Gerhana-perspektif Skim. Secara lalai ia kelihatan seperti ini:

Perspektif termasuk pandangan (dalam istilah Gerhana) pelayar projek - Navigator, paparan menunjukkan kandungan yang dihuraikan bagi fail yang diedit - Garis besar, yang akan memaparkan senarai definisi pemalar dan fungsi, serta dua paparan runtuh: paparan dengan ikon dalam bentuk huruf lambda - Definisi dan pandangan Konsol.

Ke menu utama Gerhana kumpulan arahan tambahan Skim, direka terutamanya untuk mengawal penterjemah. Ke panel pelancaran cepat Tiga butang dipaparkan (dilengkapi dengan ikon dalam bentuk huruf lambda), dari kiri ke kanan: mulakan jurubahasa, mulakan semula jurubahasa dan hentikan jurubahasa.

Sebelum anda mula bekerja dengan editor, anda perlu membuat Projek gerhana, yang akan menyimpan fail kod sumber. Khusus kepada Skim pemalam jenis projek Skrip Skema tidak menyediakan, jadi anda perlu membuat projek biasa dari direktori Umum:

Projek yang dibuat akan dipaparkan dalam navigator:

Sekarang dalam projek anda boleh laksanakan Baharu -> Fail dan buat fail yang direka bentuk untuk menyimpan kod sumber Skim. Fail ini mesti mempunyai sambungan .ss atau .scm. Fail dengan sambungan ini akan diedit menggunakan editor khas daripada penghantaran Skrip Skema.

Mengedit Kod Sumber

Skrip Skema menyediakan editor kod sumber untuk bahasa tersebut Skim dengan kemungkinan yang agak kaya. Mari kita lihat mereka dengan lebih dekat.

Pertama sekali, perlu diperhatikan menyerlahkan kurungan berpasangan. Apabila mengedit kod ke Lisp-seperti bahasa peluang ini adalah perlu kerana dalam mana-mana pembinaan yang lebih atau kurang kompleks seseorang boleh keliru dengan kurungan pembukaan yang sepadan dengan kurungan penutup yang mana.

Editor mengandungi terbina dalam Penganalisis ketepatan ungkapan-S. Jika, sebagai contoh, kurungan penutup ditinggalkan, mesej ralat akan dihasilkan:

Begitu juga ada perkara yang berguna, Bagaimana penggantian automatik atau penyiapan ungkapan. Iaitu, jika anda menekan ketika menaip Ctrl+Ruang, maka tetingkap akan muncul dengan pilihan yang tersedia penyiapan pembinaan yang dimasukkan:

Apabila membuat definisi (contohnya, menggunakan kata kunci tentukan) mereka ditambahkan pada paparan Garis besar, yang membolehkan anda mengakses definisi yang dikehendaki dengan cepat jika perlu:

Pasangkan Skrip Skema menambah dua kumpulan item pada menu konteks editor kod: Sumber- mengandungi arahan untuk mengedit kod sumber - dan Eval- mengandungi arahan untuk tafsirannya:

Pertimbangkan sekumpulan item menu Sumber:

Cari definisi- mencari definisi simbol dalam kod sumber. Iaitu, sebagai contoh, kita perlu melihat bagaimana simbol itu ditakrifkan persegi. Untuk melakukan ini, anda perlu meletakkan kursor selepas daripada simbol ini

dan tekan F12. Kursor akan bergerak ke definisi fungsi persegi, dan takrifan ini akan diserlahkan:

Simbol lengkap- kita sudah biasa dengan arahan ini; ia adalah arahan auto-lengkap.

Huraikan simbol- memaparkan petua alat dengan penerangan tentang simbol. Sebagai contoh, simbol yang kita pertimbangkan dalam contoh sebelumnya persegi ialah fungsi:

Sisipkan ulasan pengepala- menambah ulasan global pada permulaan fail dengan kod sumber. Dalam tetapan (lihat di bawah) anda boleh menentukan beberapa medan untuk ulasan sedemikian - pengarang, hak cipta, dsb.

Sisipkan ulasan bab- menambah ulasan pada blok kod tertentu - satu set fungsi dan definisi.

Sisipkan ulasan bahagian- menambah ulasan pada fungsi atau definisi tertentu.

Togol ulasan- komen/nyahkomen blok kod yang dipilih. Jika blok kod bukan ulasan, maka aksara utama ";" ditambahkan padanya:

Dan, oleh itu, sebaliknya - jika beberapa ungkapan diulas, maka simbol ulasan akan dialih keluar:

Mampatkan ruang- mengalih keluar ruang dan baris baharu tambahan sebelum dan seterusnya. Sesuatu seperti fungsi memangkas:

Format- memformat kod mengikut tetapan yang ditentukan. Inden, keluarkan ruang tambahan dan putus baris.

Kod sebelum memformat

Kod selepas pemformatan

Tukar ungkapan S- menukar susunan ungkapan-S pada tahap bersarang yang sama. Sebagai contoh, jika dalam contoh sebelumnya anda melaksanakan arahan ini, maka senarai Dan lambda bertukar tempat:

Pada titik Skim menu utama Gerhana mengandungi arahan Cari Simbol Skim(juga boleh didapati di Ctrl+F12). Apabila anda memanggil arahan ini, kotak dialog muncul yang membolehkan anda mencari definisi dengan cepat fungsi yang diperlukan. Sebagai contoh, kami mempunyai fungsi yang ditakrifkan dalam fail kod sumber persegi, masing-masing, jika di lapangan Masukkan awalan simbol: masukkan kotak dialog persegi, kemudian di lapangan Simbol yang sepadan fungsi yang ditakrifkan dalam kod akan muncul persegi:

Jika dari padang Simbol yang sepadan pilih fungsi ini, kursor dalam editor akan bergerak secara automatik ke tempat ia ditakrifkan. Mari kita anggap bahawa kita mempunyai beberapa fail dengan kod sumber dan fungsi ditakrifkan dalam setiap satu persegi. Kemudian, sebagai tambahan kepada fungsi itu sendiri, anda juga perlu memilih fail. Untuk tujuan ini, gunakan borang Definisi, di mana, selepas memilih fungsi, maklumat tentang pilihan untuk definisinya daripada fail yang berbeza diletakkan:

Tafsiran

Apabila kod ditulis, anda ingin menyemaknya, sebagai contoh, dengan menjalankannya pada jurubahasa Skim. Pasangkan Skrip Skema menyediakan peluang untuk ini juga. Pertama sekali, perkara ini Skim menu utama Gerhana, mengandungi arahan untuk memilih penterjemah yang dikehendaki dan mengawalnya: mula, mulakan semula dan berhenti (perlu jika aplikasi membeku, sebagai contoh, gelung kekal. Kerana Skim boleh mengoptimumkan rekursi ekor, gelung kekal adalah benar-benar kekal).

Rajah menunjukkan pilihan untuk memilih jurubahasa. Pertama sekali ini - Jurubahasa Luar- menyambungkan penterjemah luaran yang dipasang pada mesin yang sama seperti Gerhana. Jurubahasa Skim sekarang banyak, bawah Windows anda boleh menggunakan, sebagai contoh, Skim Chez.

Kawa tertanam- termasuk dalam penghantaran Skrip Skema jurubahasa Kawa. Sedang dibangunkan di bawah naungan GNU pada Jawa rangka kerja untuk melaksanakan bahasa peringkat tinggi dan dinamik, kod yang disusun ke dalam kod bait Java. Menjadikannya mudah untuk digunakan dalam kod Skim kelas Java dan oleh itu baik sebagai bahasa skrip. Sebagai tambahan kepada penterjemah, ia juga mengandungi pengkompil, yang membolehkan ia digunakan sebagai bahasa yang lengkap untuk JVM bagaimana ia digunakan Scala, Groovy Dan Clojure. Sesetengah peminat menggunakan Kawa untuk membangunkan aplikasi yang berjalan pada platform Android.

Jurubahasa Jauh- membolehkan anda memilih pelayan khas yang dijalankan pada mesin lain sebagai penterjemah. Sebagai contoh, di institut, semasa mengajar pengaturcaraan, anda boleh menyediakan pelayan khas yang boleh mentafsir Skim-kod. Interaksi Skrip Skema dan penterjemah ini akan dijalankan melalui rangkaian.

Jurubahasa SISC- terbina dalam REPL daripada Jurubahasa Kedua Kod Skim- ditulis dalam Jawa jurubahasa Skim.

Selepas memilih jurubahasa yang sedang berjalan, sebagai contoh Kawa, ia mesti dilancarkan dengan arahan atau butang menu yang sesuai daripada panel Pelancaran Pantas:

Sekumpulan arahan digunakan secara langsung untuk menghantar bahagian kod untuk tafsiran Eval daripada menu konteks editor kod:

Kumpulan ini mengandungi arahan berikut:

Ungkapan teratas Eval- melaksanakan ekspresi tingkat atas berbanding dengan tempat kursor berada. Jika kursor berada sebelum kurungan penutup terakhir - lihat rajah

dan arahan ini dilaksanakan, definisi fungsi akan dimuatkan ke dalam penterjemah persegi.

Ungkapan Eval sebelumnya- laksanakan ungkapan sebelumnya berbanding kursor. Jika dalam contoh

laksanakan arahan ini, ungkapan akan dimuatkan ke dalam penterjemah (* x x), yang tidak akan dapat dia penuhi, kerana parameter x tidak ditentukan:

Muatkan fail dalam Jurubahasa- muatkan fail ke dalam penterjemah, i.e. laksanakan keseluruhan kandungan fail dalam penterjemah.

Mari lihat contoh: terdapat kod untuk fungsi yang mengira n- e Nombor Fibonacci. Kami ingin mengira nombor Fibonacci keempat:

Jika anda menjalankan arahan Ungkapan Eval sebelumnya selepas (fib 4), maka ralat akan dihasilkan: penterjemah tidak mengetahui definisi fungsi fib:

Jika anda menjalankan arahan Muatkan fail dalam Jurubahasa, dan kemudian - Ungkapan Eval sebelumnya, maka pengiraan akan diteruskan dengan betul:

Sokongan Kawa REPL

Gelung baca-eval-cetak (REPL)- persekitaran pengaturcaraan interaktif yang mudah, dalam persekitaran ini pengguna boleh memasukkan ungkapan yang akan dikira serta-merta, dan hasil pengiraan akan dipaparkan kepada pengguna.

Bahagian Kawa persekitaran sedemikian disertakan. Sebagai contoh, anda boleh menentukan fungsi secara langsung dalam konsol dengan penterjemah berjalan jumlah dan hitung nilainya berbanding dengan beberapa hujah (setiap baris dianggap sebagai satu ungkapan):

Selain itu, terdapat juga pemandangan Jejak Timbunan Kawa, yang membolehkan anda memantau keadaan timbunan panggilan semasa menyahpepijat. Untuk memahami cara menggunakannya, mari kita simulasi ralat, sebagai contoh, panggil fungsi yang mengira kuasa dua nombor daripada hujah "ss":

Kawa tidak akan dapat mengira nilainya ungkapan yang diberikan dan akan memaparkan ralat hantaran jenis:

Surih tindanan akan kelihatan seperti ini:

Jika ditekan dalam borang Jejak Timbunan Kawa butang Tunjukkan bingkai Skim sahaja, maka jejak tindanan penuh akan dipaparkan, termasuk situasi luar biasa dalam kod yang ditulis Jawa, dan bukan hanya pada Skim:

tetapan

Pasangkan SkimCara adalah lanjutan yang agak fleksibel untuk persekitaran pembangunan Gerhana. Untuk memahami semua keupayaannya, anda pasti harus mempertimbangkan tetapan. Pokok tetapan bermula dengan kumpulan Skim:

Pada halaman Skim Tetapan berikut tersedia:
- Tab dipaparkan dengan- membolehkan anda menetapkan lebar (dalam ruang) untuk memaparkan aksara tab. Ini hanya berfungsi jika pasukan biasanya tidak menggantikan tab dengan ruang.
- Dayakan penyuntingan struktur- kotak semak bertanggungjawab untuk mendayakan/melumpuhkan editor berstruktur Skim. Editor berstruktur berfungsi bukan dengan simbol, tetapi dengan keseluruhan ekspresi-S. Itu. Oleh ruang belakang, sebagai contoh, keseluruhan ungkapan S akan dipadamkan sekaligus. Selain itu, apabila membuka kurungan, penutup berpasangan akan ditambah serta-merta.
- Jimat... Dan Muatkan... membolehkan anda menyimpan dan sebaliknya - memuatkan - tetapan Skrip Skema kepada/dari .epf-fail/a.

Halaman Penampilan bertanggungjawab ke atas penampilan editor. Membolehkan anda menetapkan warna yang akan diserlahkan kurungan berpasangan (kumpulan Kurungan dipadankan), warna latar belakang editor (kumpulan Latar belakang) dan warna yang digunakan untuk penyerlahan sintaks (group latar hadapan).

Rajah di atas menunjukkan contoh penetapan warna biru untuk pemalar rentetan.

Halaman Komen bertanggungjawab untuk memaparkan komen. Ia mengandungi tetapan berikut:
- Awalan untuk ulasan- awalan yang dengannya ulasan akan bermula. Secara lalai - dua titik bertitik ( ;; ).
- Kandungan medan pengarang- kandungan medan Pengarang, membolehkan anda menentukan nama pertama/akhir pengarang kod.
- Kandungan medan hak cipta- kandungan medan Hak Cipta membolehkan anda menentukan maklumat hak cipta.
- Teruskan ulasan secara automatik dari baris sebelumnya- jika kotak semak ini ditandakan, maka apabila anda menekan Masuk selepas komen pada baris baharu, ulasan akan diteruskan, i.e. baris baru akan bermula dengan ;; .

Halaman Kekunci Eval Pantas membolehkan anda menentukan arahan (iaitu nama Skim-fungsi) yang akan dilaksanakan apabila anda menekan yang sepadan pintasan papan kekunci. Secara lalai untuk semua orang Kunci Eval Cepat 0...9 sepadan dengan kombinasi kunci Alt-K, 0...9. Pada penggunaan aktif pemalam, setiap pembangun mencipta satu set nama kaedah yang sentiasa dipanggilnya (contohnya, kaedah ujian, untuk menjalankan beberapa kod ujian). Sehubungan itu, panggilan itu kaedah yang diberikan boleh diberikan kepada pintasan papan kekunci.

Halaman Lekukan berfungsi untuk mengkonfigurasi lekukan yang ditambahkan semasa menulis/memformat kod. Untuk setiap kata kunci, anda boleh menentukan tetapan lekukan yang digunakan pada hujahnya. Jadual tetapan disusun seperti berikut: dalam lajur Simbol kata kunci ditentukan, inden yang dikonfigurasikan. Kolum Skim lekukan menentukan skema lekukan. Skim tersebut adalah seperti berikut:
- lalai- semua sub-ungkapan dijajarkan di bawah aksara pertama ungkapan sekelilingnya.
- takrifan- semua subungkapan diselaraskan sebagai ungkapan pembingkaian + 2 ruang (serupa dengan reka bentuk bentuk tentukan).
- jika- semua subungkapan diselaraskan sebagai ungkapan pembingkaian + 4 ruang (serupa dengan reka bentuk bentuk jika).
- tiada- tiada lekukan, semua subungkapan dijajarkan dengan cara yang sama seperti ungkapan sekeliling.
- dengan- bentuk penjajaran yang paling kompleks, digunakan untuk fungsi dengan nama panjang dan/atau senarai besar parameter. Pertama N-parameter diinden dengan 4 ruang, selebihnya - dengan 2 ruang. Lajur Petunjuk menetapkan nilai N. Contoh penggunaan borang ini ialah penjajaran kata kunci biarkan:

Halaman Jurubahasa membolehkan anda menetapkan tetapan untuk tafsiran dan penghuraian kod. Setakat ini terdapat dua tetapan sedemikian: - jika kotak semak ditandakan, maka fail akan disimpan sebelum dihantar untuk tafsiran. Elakkan daripada perlu ingat untuk menyimpan perubahan sebelum mentafsirnya.
- Ungkapan sekeliling dengan (mulakan...)- sama ada untuk membingkai ungkapan yang ditafsirkan dalam bentuk (mulakan...). Seperti yang saya faham, pilihan ini diperlukan untuk bekerja dengan beberapa jurubahasa yang hanya boleh melaksanakan satu ungkapan S pada satu masa.

Halaman Jurubahasa Luar membolehkan anda menentukan penterjemah luaran untuk digunakan. Anda boleh menetapkan pilihan berikut:
- Nama jurubahasa- nama jurubahasa
- Barisan arahan - baris arahan, termasuk laluan penuh kepada jurubahasa dan beberapa pilihan yang ia perlukan untuk berfungsi.
- Direktori kerja- direktori kerja penterjemah ialah direktori relatif yang mana ia akan mengira laluan fail.
- Ralat Regexp - ekspresi biasa untuk menyelesaikan masalah ralat. Jurubahasa menghasilkan mesej ralat dalam beberapa formatnya sendiri, Skrip Skema mesti tahu cara mengekstrak maklumat tentang lokasi ralat dalam kod sumber dari baris ini dengan ralat. Sebagai contoh, untuk Kawa Ungkapan biasa ini ialah: [\t ]+at [^(]+\(((.+):(+))\).

Rajah di atas menunjukkan penterjemah luaran yang berjalan dalam konsol chez-scheme.

Halaman Jurubahasa Jauh mengandungi tetapan untuk menyambung kepada penterjemah jauh - jurubahasa berjalan sebagai pelayan dan mendengar port tertentu. Masing-masing, muka surat ini membolehkan anda menentukan nama hos dan port yang penterjemah jauh ini dijalankan.

Halaman Sambungan leksikal berfungsi untuk mengurus sambungan leksikal Skim. Mengandungi dua item:
- Anggap kurungan ( atau ()) sebagai ibu bapa- sama ada untuk merawat kurungan kerinting dan segi empat sama dengan kurungan bulat. Itu. sama ada untuk menyerlahkan pasangan dan sama ada untuk mengawal pasangan kurungan.
- Terima sempang (#) sebagai bahagian pengecam- sama ada untuk membenarkan penggunaan simbol cincang sebagai sebahagian daripada nama pengecam (seperti yang saya faham, ia tidak berfungsi untuk semua jurubahasa Skim).

Muka surat terakhir - Sintaks- membolehkan anda mengawal pemprosesan sintaks bahasa secara fleksibel - menambah dan mengalih keluar struktur daripada kumpulan, yang mempengaruhi penyerlahan sintaks semasa mengedit. Terdapat 5 kumpulan yang ditakrifkan pada halaman ini:
- takrifkan- definisi mengandungi kata kunci yang mana definisi bermula, contohnya - tentukan.
- Nama khas- parameter bernama khas, seperti #!kunci atau #!rehat.
- Borang khas- bentuk khas, seperti jika, dan, biarkan dan lain-lain. Malah - bahagian utama kata kunci bahasa pengaturcaraan.
- Mutator- mutator, i.e. fungsi yang mengubah keadaan. Diserlahkan secara berbeza daripada fungsi yang tidak menukar keadaan.
- berterusan- pemalar seperti #!eof, #!nul dll. Anda juga boleh menambah #t Dan #f.

Anda boleh menambah elemen anda sendiri pada setiap kumpulan, serta memadamkan yang sedia ada. Ini sangat mudah apabila membangunkan anda sendiri DSL di pangkalan Skim dan bekerja dengannya dalam editor. Selain menambah varian secara eksplisit, anda boleh menentukan ungkapan biasa dalam setiap kumpulan untuk memadankan ahlinya.

Inilah yang berlaku jika anda menambahkannya pada kumpulan takrifkan kata kunci pavel:

Kesimpulan

Kami melihat alat yang kaya dengan ciri dan sangat disesuaikan untuk pembangunan dalam bahasa pengaturcaraan Skim dalam persekitaran Gerhana. Alat ini membolehkan anda mengedit kod sumber dan berinteraksi dengan pelbagai penterjemah, termasuk yang terbina dalam dan jauh. Jika kita membandingkan keupayaan pemalam ini dengan alat pembangunan dihidupkan Skim, sebagai contoh, di bawah Emacs, maka mereka agak setanding (kecuali ketiadaan perkara kecil seperti menggantikan kata kunci lambda kepada simbol huruf Yunani lambda). Mana-mana pengaturcara yang tidak mahu menguasai Emacs boleh digunakan Gerhana berjumpa pengaturcaraan berfungsi atau lidah Skim, serta untuk menyelesaikan masalah dan latihan daripada SICP. Juga, mungkin seseorang akan berminat dengan topik pembangunan pada Skim bawah JVM menggunakan Kawa.

Saya ingin mengucapkan terima kasih kepada penulis Skrip Skema - Dominique Boucher, yang membangunkan utiliti ini secara percuma. Perlu diingat bahawa plugin Skrip Skema ialah projek sumber terbuka dan mana-mana pengaturcara boleh membantu dalam pembangunannya dengan menambah ciri yang mereka perlukan.

ZY Timbul pemikiran yang sama Skim susah nak belajar sebab tak menarik - tak ada tugasan yang menarik. Pengiraan matematik biasa tidak menarik, malah kerja mudah dengan grafik, contohnya, memerlukan platform dan perpustakaan. Lebih menarik untuk mempelajari bahasa dengan mengaplikasikannya kepada sesetengah orang bidang subjek. Jadi, SchemeScript + Kawa + Eclipse boleh dijadikan sebagai platform pembelajaran. Lihat contoh daripada Skrip Skema(dalam jar failkan direktori contoh), terdapat beberapa yang cukup menarik di sana.

Seperti biasa, anda boleh meninggalkan komen anda atau bertanya soalan kepada pengaturcara Chelyabinsk Severe.

Saya suka mesej itu -

Bahasa manakah yang harus dipilih untuk pembelajaran pengaturcaraan?Anda tidak sepatutnya mula belajar pengaturcaraan di suatu tempat di tengah-tengah.

Mula-mula anda perlu melatih otak anda, keupayaan untuk mencipta algoritma dan menerangkannya, mengetahui keupayaan bahasa tertentu. Di sekolah dan universiti tempatan, pengaturcaraan biasanya diajar menggunakan Asas atau Pascal sebagai contoh. Sehingga kini, Pascal dianggap sebagai salah satu daripada bahasa terbaik untuk latihan, ia adalah ucapan yang ketat dengan menaip statik, yang membolehkan tanpa masalah yang tidak perlu mengamalkan prinsip pengaturcaraan prosedural dan berorientasikan objek. Tetapi, setelah membiasakan diri dengan bahan pendidikan universiti Barat terkemuka (Berkeley, Stanford, MIT), saya bersetuju bahawa adalah idea yang baik untuk mula belajar dengan salah satu bahasa berfungsi.

Secara umum, ia agak pelik, tetapi paradigma berfungsi dengan keras kepala diabaikan oleh pendidikan domestik. Untuk merapatkan jurang ini, saya ingin bercakap tentang bahasa pengaturcaraan Skim.

Skim ialah bahasa pengaturcaraan yang sangat mudah. Sangat mungkin untuk mempelajarinya dalam satu hari, tetapi kesederhanaan ini menipu. Skim juga merupakan bahasa yang sangat berkuasa. Terdapat sejumlah besar pelaksanaan.

Program pensijilan disimpan dalam fail *.scm, atau anda boleh menggunakan mod penterjemah interaktif, serupa dengan Python.

Pemalar dan Pembolehubah

Mari kita mula mempelajari struktur asas Skim. Pertama sekali, mari kita tentukan pemalar:

123 - integer

3.1415926 - nombor pecahan

2 + 3i - nombor kompleks

2/3 - pecahan

#B1111 - nombor binari

#xFF - artikel perenambelasan

#O123 - nombor perlapanan

#\A - aksara tunggal

"Hai dunia!" - Rentetan aksara

"Hello - simbol

#f - nilai logik

Pemalar boleh dikendalikan menggunakan operator atau fungsi. Lagipun, Skim adalah bahasa berfungsi, dan oleh itu ia mempunyai semua fungsi.

Dalam matematik, anda sudah biasa dengan bentuk penulisan fungsi f (x) atau t (a, b). Tetapi perkara yang sama boleh ditulis dalam bentuk (f x) atau (t a b). Ini betul-betul bentuk rakaman yang digunakan oleh Skim. Bukan seperti ungkapan aritmetik, yang ditulis dalam bentuk, contohnya 2 + 3, dan dalam awalan - (+ 2 3).

Cth:

tipu daya> (+ (* 3 4) (/ 5 2))

29/2

tipu daya> (+ 1 1 1 1 1)

tipu daya> (/2)

tipu daya> (persegi 2)

1.4142135623731

Untuk mengisytiharkan pembolehubah, gunakan pembinaan (takrifkan nama nilai)

tipu daya> (takrifkan 2)

tipu daya> (takrifkan b 2)

tipu daya> (+ a b)

Nilai pembolehubah yang sedia ada boleh diubah menggunakan konstruk (set! nilai nama)

tipu daya> (set! a 5)

tipu daya>a

Fungsi diisytiharkan menggunakan konstruk (define (nama parameter) function_type)

tipu daya> (takrifkan (petak x) (* x x))

tipu daya> (petak 3)

Untuk menunjukkan pengulangan, saya akan memberikan contoh pengiraan faktorial:

(Takrifkan (fakta x)

(Jika (= x 1)

(* X (fakta (- x 1)))))

Seperti yang telah anda fahami, keadaan boleh disemak menggunakan pembinaan (jika keadaan dalam apa-apa cara)

Tanpa perincian, saya akan menarik perhatian kepada fungsi utama

(Paparkan "Hello, World!") - Paparkan rentetan

(Newline) - pergi ke baris baharu

Ia adalah mudah untuk menggunakan senarai untuk bekerja dengan set data

guile> (takrifkan nombor (senarai 1 2 3 4 5 6 7 8 9 10)) - isytiharkan senarai

guile> (list-ref nums 0) - baca elemen dengan nombor 0

guile> (nombor kereta) - baca elemen pertama

guile> (cdr nums) - baca semua elemen lain

(2 3 4 5 6 7 8 9 10)

Anda boleh memproses semua elemen senarai sekaligus

menjana senarai baru dengan menggunakan fungsi untuk setiap elemen

tipu daya> (nombor segi empat sama peta)

(1 4 9 16 25 36 49 64 81 100)

tipu daya> (peta (lambda (x) (* x 3)) nombor)

(3 6 9 12 15 18 21 24 27 30)

Pembinaan lambda membolehkan anda mengisytiharkan fungsi seperti yang diperlukan tanpa memberi mereka nama. Jika anda memprogram dalam Python, anda sudah tahu binaan ini.

Sebenarnya, Skim tidak mempunyai gelung seperti yang ada bahasa imperatif. Di sini rekursi digunakan untuk tujuan yang sama. Sebagai contoh, mari kita paparkan kandungan senarai dalam lajur

(Takrifkan (senarai cetak pertama)

(Jika (bukan (null? Lst)))

(Mulakan (paparan (kereta pertama))

(Baris baru)

(Senarai cetak (cdr lst)))))

Pembinaan (mulakan ...) digunakan jika anda perlu memasukkan beberapa operator di mana sintaks membenarkan hanya satu.

Pembinaan berikut membolehkan anda mensimulasikan gelung for yang diketahui daripada bahasa pengaturcaraan lain:

(Biar gelung ((i 1))

(Paparan i)

(Baris baru)

(Jika (<= i 10) (loop (+ i 1))))

Binaan let digunakan apabila anda perlu mengisytiharkan pembolehubah tempatan dalam ungkapan, atau apabila anda perlu mengisytiharkan fungsi bersarang. Dengan cara ini, hampir semua pilihan kitaran yang mungkin boleh dilaksanakan. Sudah tentu, anda sentiasa boleh mencipta fungsi anda sendiri untuk memendekkan notasi, kerana fungsi boleh dihantar sebagai parameter kepada fungsi lain, sama seperti data mudah. Secara umum, Skim membolehkan anda menyesuaikan bahasa mengikut keinginan anda. Bahasa yang sangat fleksibel.

Sebagai contoh, anda boleh memberikan pelaksanaan fungsi untuk mengira kamiran pasti

(Takrifkan (fungsi x)

(Takrifkan (sepadukan a b e f)

(Takrifkan jumlah 0)

(Biar gelung ((i a))

(Jika (

(Tetapkan! Jumlah (+ jumlah (* (f i) e)))

(Gelung (+ i e)))))

jumlah)

(Paparan (integrasikan fungsi 0 1 0.01))

(Baris baru)

laman web rasmi Guile

Schemers.org

Rakaman video kuliah mengenai kursus The Structure and Interpretation of Computer Programs at Berkeley University

Secara umum, memandangkan Skim adalah bahasa akademik, terdapat banyak maklumat mengenainya. Pada masa yang sama, pengetahuan tentang bahasa ini bukan sahaja membolehkan anda melihat semula pelbagai binaan dalam bahasa lain (seperti Python, sebagai contoh).

Bahasa Skim secara tradisinya mempunyai sokongan yang cukup baik untuk Emacs. Sokongan ini disediakan oleh satu set pakej yang boleh berfungsi dengan kedua-dua pelaksanaan sewenang-wenangnya bahasa ini ( mod skema, cmuscheme, dukun), dan hanya menyokong pelaksanaan khusus ( xscheme, gds, mod lebah, gambit). Biasanya, sokongan khusus pelaksanaan agak lebih komprehensif daripada pakej yang menyokong semua pelaksanaan.

Artikel ini cuba merangkumi semua isu sokongan pengaturcaraan dalam Skim, dan mula-mula bercakap tentang perkara biasa untuk semua pelaksanaan, dan kemudian mempertimbangkan pakej yang melaksanakan sokongan untuk versi bahasa tertentu.

Mod skim

Mod skim dibekalkan dengan pengedaran Emacs adalah pengubahsuaian mod lisp untuk bekerja dengan kod sumber dalam bahasa Skim. Pakej ini melaksanakan fungsi berikut:

  • penonjolan sintaks
  • lekukan
  • menyerlahkan kurungan berpasangan

Di pangkalan mod skema Beberapa pakej lain telah dibuat - , dan lain-lain yang memanjangkan fungsinya dengan menambahkan fungsi untuk melaksanakan kod terus daripada penimbal Emacs, dsb. perkara.

Mod ini didayakan secara automatik untuk fail yang menggunakan sambungan standard untuk fail sumber Skim - .scm, .ss, dsb. Untuk mendayakan mod ini untuk fail lain, tambah kod berikut pada fail permulaan anda (menggantikan .scm dengan sambungan yang diingini):

(tambah-ke-senarai "auto-mode-alist"("\\.scm$" . skim-mod))

Jika anda ingin menukar tingkah laku pakej, anda boleh menetapkan parameter dalam fungsi yang, apabila ditambahkan pada pembolehubah skim-mod-cangkuk, akan dipanggil apabila mod didayakan dalam penimbal tertentu. Di samping itu, beberapa parameter boleh ditetapkan melalui alat konfigurasi standard. Kumpulan tetapan yang sepadan dipanggil skema.

Cmuscheme

Beg plastik cmuscheme telah ditulis oleh Olin Shivers bertahun-tahun yang lalu, tetapi masih merupakan salah satu pakej Skim utama. Pakej ini melaksanakan kerja interaktif dengan penterjemah bahasa Skim. Interaksi dengan penterjemah direalisasikan dengan menggunakan keupayaan pakej datang, disertakan dengan Emacs.

Persediaan pakej

Menyediakan pakej agak mudah - letakkan kod berikut dalam fail permulaan anda

(autoload "run-scheme "cmuscheme" "Run an inferior Scheme" t) (setq scheme-program-name "mzscheme" )

dan pakej akan dimuatkan secara automatik pada kali pertama anda menjalankan fungsi run-scheme. Baris kedua dalam contoh ini digunakan untuk menentukan nama jurubahasa Skim, yang boleh anda gantikan dengan dialek kegemaran anda. Semua tetapan untuk pakej ini juga tersedia untuk konfigurasi interaktif melalui kumpulan konfigurasi cmuscheme.

Penampan penterjemah yang dibuat oleh pakej menggunakan mod khas - mod-skim-inferior, yang boleh dikonfigurasikan menggunakan cangkuk mod-skim-inferior. Selain itu, jika fail ~/.emacs_SCHEMENAME atau ~/.emacs.d/init_SCHEMENAME.scm wujud (di mana SCHEMENAME ialah nama penterjemah), ia akan dilaksanakan serta-merta selepas penterjemah dimuatkan.

Bekerja dengan pakej

Fungsi utama pakej ialah fungsi run-scheme, yang melancarkan penterjemah bahasa Skim yang dipilih dan membenarkan pelaksanaan kod interaktif tanpa meninggalkan Emacs.

Dengan berbuat demikian, anda boleh mengawal bahagian kod (blok khusus, definisi fungsi atau ungkapan tunggal) akan dilaksanakan dengan menggunakan fungsi berbeza yang ditakrifkan oleh pakej - fungsi skema-hantar-definisi (pintasan papan kekunci C-c C-e atau C-M-x) menyerahkan definisi semasa kepada jurubahasa untuk pelaksanaan ; fungsi skim-send-region (C-c C-r) membolehkan anda melaksanakan sekeping kod sumber yang dipilih; skema fungsi-send-last-sexp (C-x C-e) digunakan untuk menilai ungkapan yang berada di hadapan kursor; dan fungsi skim-load-file (C-c C-l) membolehkan anda memuatkan keseluruhan fail ke dalam penterjemah (ia membolehkan anda melaksanakan kod daripada mana-mana fail yang ditentukan oleh pengguna, bukan hanya dari penimbal semasa).

Jurubahasa Skim berjalan dalam penimbal berasingan yang dipanggil *skema* , di mana hasil penilaian ekspresi dan fungsi juga dikeluarkan. Untuk menukar dengan cepat kepada penimbal ini daripada penimbal teks sumber, terdapat suis-ke-skim fungsi yang berasingan (C-c C-z). Di samping itu, kerana ia sering diperlukan untuk melaksanakan kod dan melihat hasilnya, pakej juga mentakrifkan dua fungsi yang menghantar kod kepada penterjemah untuk pelaksanaan, dan beralih kepada *skim* penimbal - scheme-send-definition-and-go ( C-c M-e) untuk pengiraan takrif semasa dan skim-send-region-and-go (C-c M-r) untuk menilai kod sumber yang diperuntukkan.

Untuk bekerja dengan makro, pakej menyediakan fungsi skema- kembangkan-semasa (C-c C-x), yang membolehkan anda mengembangkan definisi makro semasa ke dalam kod Skim yang sepadan. Pengembangan kod dilakukan oleh penterjemah dan output kepada penimbal *skim*. Dan apabila bekerja dengan pelaksanaan Skim yang menyokong penyusunan kod sumber, pengguna boleh memanfaatkan fungsi skim-kompil-fail (C-c C-k) dan skema-kompil-definisi (C-c M-c), yang menyusun fail atau definisi semasa, masing-masing. .

Seperti yang dinyatakan di atas, terdapat mod khas dalam penampan penterjemah - mod-skim-inferior di mana semua arahan mod komin berfungsi, serta arahan berikut cmuscheme- skim-kompil-fail (C-c C-k), fail-skim-muat (C-c C-l), skim-hantar-terakhir-sexp (C-x C-e) dan skim-hantar-definisi (C-M-x).

Cuak

Pakej Quack adalah lanjutan kepada pakej cmuscheme dan melaksanakan ciri tambahan berikut (kebanyakannya berkaitan terutamanya dengan bekerja dengan Skim PLT):

  • menu yang membolehkan anda mengakses bahasa, penterjemah dan dokumentasi SRFI, serta keupayaan untuk mencari perihalan nama fungsi yang terletak pada kedudukan kursor semasa;
  • kit lampu latar baharu untuk kunci fon- untuk Skim PLT dan dilanjutkan, untuk pelaksanaan lain;
  • kemungkinan menggunakan simbol Yunani lambda untuk menandakan ungkapan lambda (contoh diberikan di bawah);
  • pilihan dan arahan tambahan untuk memasukkan kurungan pembukaan dan penutup yang betul;
  • sambungan untuk peraturan lekukan, dengan keupayaan untuk mengkonfigurasi untuk penterjemah Skim yang berbeza;
  • versi lanjutan bagi arahan run-scheme, yang mengetahui nama arahan penterjemah Skim yang popular, dan juga mengingati versi penterjemah yang dilancarkan terakhir;
  • versi lanjutan perintah suis ke skema;
  • keupayaan untuk melihat kandungan koleksi .plt dan arahan untuk membuka penimbal Dired untuk koleksi yang diingini.

Pemasangan dan konfigurasi

Pakej itu ditulis oleh Neil Van Dyke, dan tersedia untuk dimuat turun dari laman web pengarang. Pakej dipasang dengan menyalinnya ke direktori di mana Emacs boleh menemuinya, dan dimuatkan dengan arahan:

(memerlukan "quack")

Semua tetapan pakej boleh dikonfigurasikan menggunakan kumpulan tetapan quack, atau menggunakan menu Quack. Tetapan ini termasuk alamat manual dan SRFI, mentakrifkan pintasan papan kekunci awalan yang digunakan oleh pakej, dsb.

Pengguna Skim PLT disyorkan untuk memuat turun manual untuk penterjemah ini dari tapak web projek dan memasangnya dalam koleksi doc. Lokasi koleksi Skim PLT ditentukan sama ada oleh pembolehubah quack-pltcollect-dirs, yang boleh menyenaraikan semua direktori dengan koleksi berfungsi, atau oleh pembolehubah persekitaran PLTHOME dan/atau PLTCOLLECTS.

Pakej ini juga memerlukan kehadiran program wget, yang akan digunakan untuk mengakses SRFI.

Bekerja dengan pakej

Selepas memuat turun pakej, sebagai tambahan kepada fungsi cmuscheme Dan mod skema Fungsi yang ditakrifkan oleh pakej menjadi tersedia. Pengguna boleh melaksanakan fungsi ini sama ada menggunakan mekanisme standard (pintasan papan kekunci dan/atau pelancaran mengikut nama fungsi) atau menggunakan menu Quack.

Anda boleh melihat dokumentasi menggunakan beberapa fungsi. Fungsi quack-view-manual (C-c C-q m) digunakan untuk melihat dokumentasi dalam pelayar web. Perintah ini membolehkan anda melihat kedua-dua dokumentasi asas untuk bahasa Skim dan dokumentasi untuk pelaksanaan tertentu. Untuk melihat SRFI, arahan berasingan ditakrifkan - quack-view-srfi (C-c C-q s), yang meminta nombor dokumen yang dikehendaki dan membukanya dalam penyemak imbas. Dan untuk pengguna Skim PLT, perintah quack-view-keyword-docs (C-c C-q k) juga tersedia, yang memaparkan dokumentasi untuk kata kunci tertentu ( Operasi arahan ini bergantung pada pemasangan yang betul bagi dokumentasi Skim PLT).

Seperti yang dinyatakan di atas, pakej melaksanakan fungsi run-scheme (C-c C-q r), yang membolehkan anda melancarkan penterjemah bahasa Skim, memilihnya daripada senarai yang diketahui (termasuk melancarkan dengan pilihan yang diperlukan), dan juga mengingati yang terakhir pengguna. pilihan.

Fungsi mudah untuk bekerja dengan koleksi juga ditakrifkan untuk pengguna Skim PLT. Fungsi quack-find-file (C-c C-q f) membuka fail, menggunakan data daripada konteks semasa untuk mendapatkan nama fail. Sebagai contoh, jika anda menggunakan fungsi ini semasa kursor berada pada kod (memerlukan (lib "list.ss") maka anda akan digesa untuk membuka senarai fail.ss daripada koleksi mzlib. Di samping itu, fungsi quack-dired-pltcollect ditakrifkan, yang membolehkan anda membuka penimbal Dired untuk koleksi Skim PLT yang dikehendaki (apabila menyatakan nama, pengguna boleh menggunakan autolengkap nama koleksi).

Pakej ini juga melaksanakan beberapa fungsi yang mengubah pemformatan kod, menjadikannya lebih mudah untuk digunakan. Fungsi quack-tidy-buffer (C-c C-q t) inden semula kod, menggantikan tab dengan ruang, mengalih keluar baris kosong tambahan, mengalih keluar ruang putih mengekori daripada baris dan menambah baris baharu pada penghujung fail jika tiada. Fungsi quack-toggle-lambda (C-c C-q l) menukar pengisytiharan fungsi semasa daripada (define (func args) ...) kepada (define func (lambda (args) ..)), yang membenarkan tanda lambda kepada ditunjukkan dalam kod (apabila pilihan didayakan untuk memaparkan simbol ini). Sebagai contoh, seperti ini:

Pakej GCA

G.C.A.— pakej yang direka untuk berfungsi dengan berkesan dengan kod sumber Skim. Ia direka untuk menyokong Skim Gauche, tetapi boleh digunakan dengan dialek lain. Suka dukun, ia memanjangkan fungsi pakej cmuscheme.

Pakej ini mempunyai ciri-ciri berikut:

  • memasukkan kepingan kod menggunakan mekanisme templat
  • paparan penerangan untuk fungsi
  • penambahan nama

Pakej ini mempunyai beberapa perbezaan seni bina daripada pakej lain - bukannya berinteraksi dengan penterjemah menggunakan input dan output standard, pakej ini menggunakan protokol rangkaian mudah untuk memindahkan data. Pendekatan ini membolehkan anda melaksanakan lebih banyak tugas, tetapi sangat bergantung pada pelaksanaan penterjemah dan memerlukan proses Skim berasingan (pelayan gds), yang akan digunakan untuk berinteraksi dengan proses lain.

Pemasangan dan konfigurasi

Beg plastik gds dihantar dengan versi terbaharu Guile, jadi apa yang anda perlu lakukan ialah menambah fail sumber Emacs Lisp ke laluan carian Emacs anda dan tambahkan baris berikut pada fail permulaan:

(memerlukan "gds")

Perintah ini memuat turun pakej dan melancarkan proses berasingan yang akan bertanggungjawab untuk berinteraksi dengan jurubahasa Skim. Perlu diingat bahawa untuk pakej berfungsi, pakej berasingan untuk Skim mesti ada dalam laluan carian Guile. Jika pakej berada di lokasi bukan standard, anda boleh menentukan lokasinya menggunakan pembolehubah direktori-gds-scheme, jika tidak, jika pakej ini tidak ada, pakej tidak akan dimuatkan sepenuhnya.

Tetapan lain boleh ditetapkan menggunakan kumpulan tetapan gds.

Bekerja dengan kod sumber

Beg plastik gds menggunakan pintasan papan kekunci yang sama untuk mengira kod seperti cmuscheme. Pengecualian ialah fungsi gds-eval-expression (C-c C-e), yang menilai ungkapan yang dimasukkan dalam minibuffer.

Salah satu penambahan yang bagus dilaksanakan gds adalah untuk melengkapkan nama fungsi dan pembolehubah, serta mendapatkan bantuan tentang simbol tertentu dan/atau mencari simbol mengikut nama.

Penyempurnaan nama dilakukan oleh fungsi simbol lengkap-gds (pintasan M-TAB), yang cuba mencari semua simbol yang diketahui yang namanya sepadan dengan huruf di hadapan kursor. Jika satu nama ditemui, ia dimasukkan serta-merta, tetapi jika terdapat beberapa pilihan, tetingkap baharu akan ditunjukkan di mana pengguna boleh memilih nama yang dikehendaki.

Mendapatkan bantuan untuk simbol tertentu dilakukan menggunakan fungsi gds-help-symbol (C-h g), yang menghasilkan hasil yang sama seperti menjalankan arahan (help SYMBOL) dalam persekitaran interaktif Guile. Nama simbol digesa daripada pengguna melalui penimbal mini, tetapi nilai lalai ialah nama yang dihidupkan kursor. Jika anda tidak ingat nama sebenar simbol, anda boleh menggunakan fungsi gds-apropos (C-h G), yang serupa dengan melaksanakan (apropos REGEXP) dalam Guile dan yang mencetak senarai simbol yang namanya sepadan dengan yang dimasukkan. ekspresi biasa.

Penyahpepijatan

Untuk memanfaatkan peluang gds semasa kerja interaktif, pengguna mesti tetap menyatakan secara eksplisit modul yang akan menyediakan kerja dengannya gds. Sebagai contoh, menggunakan kod berikut memuatkan semua modul yang diperlukan untuk operasi:

(modul penggunaan (perangkap penyahpepijatan gds-klien ais-9)) (penggunaan-modul-bernama! "(pengguna-penipu) "(sesi ais-9)) (gds-accept-input #f)

Selepas ini, anda boleh bekerja dengan gds. Untuk menetapkan titik putus dalam prosedur proc_name, yang berikut digunakan, dikira dalam penimbal kod sumber:

(pasang-perangkap (buat #:behaviour gds-debug-trap #:procedure proc_name))

dan selepas memanggil prosedur yang ditentukan, anda akan menerima dalam penimbal gds sesuatu seperti ini:

Prosedur panggilan: => s s --:** PID XXXXX (Guile-Debug)--Semua--------

dalam penimbal ini anda boleh menavigasi tindanan, melihat keadaannya, meneruskan pelaksanaan program dan/atau melangkah melaluinya. Kerja dalam penimbal tindanan dipastikan dengan menggunakan beberapa arahan yang terikat pada kunci individu.

Kekunci berikut boleh digunakan untuk bergerak melalui timbunan panggilan fungsi: u , C-p dan anak panah atas digunakan untuk bergerak ke atas timbunan panggilan dan memilih bingkai itu (fungsi gds-up), d , C-n dan anak panah ke bawah digunakan untuk bergerak ke bawah (gds-down) , dan kekunci RET digunakan untuk memilih bingkai di mana kursor terletak.

Memilih bingkai tindanan menyebabkan bahagian kod sumber yang sepadan ditunjukkan. Selain itu, beberapa fungsi juga akan menggunakan persekitaran yang berkaitan dengan bingkai yang dipilih semasa melaksanakan.

Fungsi tambahan yang beroperasi dalam penimbal tindanan termasuk yang berikut:

gds-evaluate (e key) membolehkan anda menilai ungkapan menggunakan persekitaran yang sepadan dengan bingkai yang dipilih, dengan hasilnya dipaparkan dalam kawasan gema; gds-frame-info(i) menunjukkan maklumat tentang bingkai yang dipilih - baris dalam fail sumber, ungkapan yang sepadan, jenis bingkai, dsb.; gds-frame-args(A) menunjukkan hujah bingkai aplikasi; gds-proc-source(S) menunjukkan kod sumber prosedur yang dipanggil. Fungsi ini sangat berguna dalam kes di mana prosedur dibuat oleh ungkapan lambda tanpa nama, kerana prosedur sedemikian ditunjukkan dalam timbunan panggilan fungsi sebagai Yang tidak menjelaskan apa yang akan dilakukan seterusnya.

Untuk meneruskan pelaksanaan program yang terganggu, gds melaksanakan fungsi berikut:

gds-go (g , c atau q) meneruskan pelaksanaan program; gds-step-file (SPC) melaksanakan satu langkah fungsi kepunyaan fail sumber yang sama dengan bingkai tindanan yang dipilih. Fungsi daripada fail lain akan dilaksanakan, tetapi tanpa memasukkannya; gds-langkah-ke dalam (i) melakukan langkah seterusnya. Ini adalah tahap pelaksanaan program yang paling terperinci; gds-step-over (o) melaksanakan program sehingga bingkai tindanan yang dipilih selesai dilaksanakan.

Menggunakan semua fungsi ini, pembangun boleh menerima maklumat terperinci tentang keadaan program, dan mempunyai peluang untuk mencari dan membetulkan ralat.

Skim48

skim48- pakej lain berdasarkan cmuscheme, tetapi menyediakan sokongan lanjutan untuk pelaksanaan Skim48. Pakej ini menambah sokongan kunci fon untuk kata kunci dan pengendali khusus Skim48, serta pengikatan utama tambahan untuk perintah penilaian ungkapan.

Prosedur untuk memasang pakej ini adalah standard - letakkan gambit.el di tempat di mana Emacs akan menemuinya, dan tambahkan baris berikut pada fail permulaan:

(automuat "gambit-inferior-mode "gambit" "Kaitkan mod Gambit ke dalam cmuscheme.") (autoload "gambit-mod "gambit" "Gabungkan mod Gambit ke dalam skema.") (add-hook "inferior-scheme-mod-hook (function gambit-inferior-mod)) (add-hook "scheme-mod-hook (function-gambit-mod-hook) (setq scheme-program-name "gsi -: d-")

Jurubahasa Gambit dilancarkan menggunakan fungsi run-scheme yang dilaksanakan dalam cmuscheme, Tetapi gambit menambah rutin penapisan output kepadanya, yang membolehkan pakej mendapatkan maklumat lokasi dalam fail sumber. Selepas melancarkan penterjemah, pengguna boleh menggunakan pintasan papan kekunci standard untuk melaksanakan dan menyusun kod - C-x C-e, C-c C-l, C-c C-k, dsb.

Sebagai tambahan kepada ciri-ciri cmuscheme, beg plastik gambit menawarkan beberapa fungsi yang direka untuk menyahpepijat kod sumber:

gambit-continue (F8 atau C-c c) teruskan melaksanakan kod. Sama dengan perintah,c jurubahasa; gambit-crawl-backtrace-newer (F9 atau C-c ]) pergi ke bingkai sebelumnya dalam rantai. Sama seperti arahan - jurubahasa; gambit-crawl-backtrace-older (F10 atau C-c [) beralih ke bingkai seterusnya dalam rantai. Sama dengan arahan + penterjemah; gambit-step-continuation (F11 atau C-c s) lakukan satu langkah pengiraan termasuk memasukkan fungsi yang dipanggil. Sama seperti perintah jurubahasa, s; gambit-leap-continuation (F12 atau C-c l) melakukan satu langkah pengiraan tanpa memasukkan fungsi yang dipanggil. Sama seperti perintah jurubahasa,l; gambit-kill-last-popup (C-c_) padam tetingkap yang dibuat untuk memaparkan ungkapan.

Terdapat pintasan papan kekunci yang lebih pendek untuk arahan ini: M-c , M-[ , M-] , M-s , M-l dan M-_ , tetapi ia tidak didayakan secara lalai kerana ia tidak begitu mengikut konvensyen pintasan papan kekunci dalam Emacs. Untuk mendayakan penggunaannya, anda perlu menjalankan arahan berikut (atau meletakkannya dalam fail permulaan):

(setq gambit-repl-command-prefix "\e") )

Mod lebah (bmacs)

bmacs ialah pelaksanaan persekitaran perisian bersepadu untuk bekerja dengan Skim Bigloo. Pakej ini melaksanakan ciri-ciri berikut:

  • penyahpepijatan kod;
  • pemprofilan;
  • penciptaan automatik dan pengemaskinian Makefiles;
  • navigasi kod;
  • penyepaduan dengan sistem kawalan versi;
  • melihat dokumentasi;
  • pelaksanaan kod interaktif;
  • pengembangan makro;
  • beberapa sokongan untuk gaya pengaturcaraan celik.

Pakej ini memerlukan beberapa utiliti tambahan untuk berfungsi, kebanyakannya disertakan dengan Bigloo. Dokumentasi boleh didapati di laman web projek, atau sebagai sebahagian daripada pengedaran.

Pemasangan dan konfigurasi

Pakej ini dibekalkan sebagai sebahagian daripada Skim Bigloo dan terletak dalam subdirektori bmacs pengedaran. Untuk memasang pakej, pergi ke direktori ini dan jalankan arahan di sana:

Buat buat pasang EMACSDIR =

yang akan memasang fail yang diperlukan di lokasi yang anda tentukan. Selepas ini, anda boleh menambah baris berikut pada fail permulaan anda untuk memuatkan pakej secara automatik apabila anda membuka fail sumber:

(automuat "bdb "bdb" "mod bdb" t) (automuat "mod lebah "mod lebah" "mod lebah" t) (setq auto-mod-alist (tambah "(("\\.scm$" . mod lebah) ("\\.sch$" . mod lebah) ("\\.scme$" . mod lebah) ("\\.bgl$" . mod lebah) ("\\.bee$ " . mod lebah)) mod-auto-alist))

Tetapan pakej boleh ditetapkan menggunakan kumpulan tetapan lebah, yang menyediakan tetapan untuk mod lebah, dan kumpulan dbg & pepijat, digunakan untuk menetapkan tetapan penyahpepijat.

Bekerja dengan kod sumber

Selepas memuat turun mod lebah pengguna boleh melaksanakan arahan asas menggunakan ikon bar alat yang sepadan, atau dengan memilih item yang diperlukan daripada menu Bee, yang muncul apabila mod dilancarkan.

Untuk inden mengikut konvensyen Bigloo, pakej mod lebah mentakrifkan beberapa fungsi: bee-indent-sexp (C-M-q) mengesot ungkapan semasa, bee-indent-define (C-c TAB C-d) melakukan ini untuk takrifan fungsi semasa, bee-indent-last-sexp (C-c TAB C-l) mengesot ungkapan sebelum kursor, dsb.

Satu set fungsi yang sangat penting yang digunakan semasa bekerja dengan kod sumber ialah fungsi untuk mencari definisi fungsi dan pembolehubah. Untuk mencari definisi pembolehubah, anda boleh menggunakan tag lebah-cari (C-x 5 .) atau pembolehubah-tag lebah (C-c C-d f). Dan untuk mencari definisi modul, terdapat fungsi bee-find-module (C-c C-d m). selain itu, mod lebah mentakrifkan semula dua pintasan papan kekunci - M-. & M-, yang mengikat pada fungsi bee-tag-find dan bee-tags-find-next, membenarkan fungsi dan definisi kelas ditemui.

Untuk memudahkan kerja dengan modul, mod lebah mentakrifkan satu set fungsi yang menguruskan senarai modul yang diimport oleh kod sumber semasa - fungsi pengikat import lebah (C-c RET i), serta senarai fungsi dan pembolehubah yang dieksport daripada modul semasa - eksport lebah- fungsi (C-c RET f) dan pembolehubah eksport lebah (C-c RET v). Di samping itu, terdapat fungsi berasingan yang membolehkan anda mengimport simbol daripada fail C - bee-import-c-file (C-c RET c), dan ia juga mengemas kini Makefile untuk menambah kebergantungan untuk menyusun kod yang sepadan.

Pakej ini juga menyediakan beberapa sokongan untuk apa yang dipanggil pengaturcaraan celik. Sokongan yang diberikan tidak lengkap, tetapi sekurang-kurangnya membolehkan anda memasukkan pautan ke modul dan penerangan fungsi ke dalam kod. Ini dicapai dengan menggunakan kata kunci @path , @node & @deffn dalam ulasan modul dan huraian fungsi. Kata kunci @path & @node mentakrifkan bahagian fail dan dokumentasi yang menerangkan modul tertentu dan dinyatakan dalam ulasan untuk pengisytiharan modul. Dan kata kunci @deffn ditunjukkan dalam ulasan untuk fungsi tersebut. Dengan menggunakan kata kunci ini, pembangun boleh menavigasi dengan pantas ke bahagian dan perihalan ciri yang berkaitan, membolehkan dokumentasi kod yang lebih baik.

Melaksana dan Menyusun Kod

Sama seperti pakej lain, mod lebah membolehkan anda melaksanakan kod Skim terus daripada penimbal Emacs. Untuk melancarkan penterjemah, anda perlu melaksanakan fungsi ude-repl-other-frame (C-c C-r C-r), pilih ikon bar alat yang sesuai ( Repl), atau item menu yang sepadan.

Dan selepas memuatkan penterjemah, pengguna boleh melaksanakan kod menggunakan fungsi berikut:

  • ude-repl-send-buffer (C-c C-r b) menghantar keseluruhan penimbal untuk pengiraan;
  • ude-repl-send-region (C-c C-r r), menghantar blok kod yang dipilih kepada penterjemah;
  • bee-repl-send-define (C-c C-r d) digunakan untuk melaksanakan definisi semasa;
  • bee-repl-send-last-sexp (C-c C-r l) menilai nilai ungkapan sebelum kursor;
  • bee-repl-send-toplevel-sexp (C-c C-r t) digunakan untuk menilai keseluruhan ungkapan semasa.

Selalunya, apabila menggunakan makro, anda perlu dapat mengembangkannya. Sama seperti untuk bekerja dengan kod biasa, mod lebah melaksanakan satu set fungsi untuk mengembangkan makro dalam kod anda (dalam kes ini, keseluruhan penimbal akan diimbas untuk kehadiran definisi makro):

  • bee-expand-buffer (C-c C-e C-e) menyebabkan makro dalam penimbal semasa dikembangkan;
  • bee-expand-region (C-c C-e C-r) mengembangkan makro dalam kod-belakang;
  • bee-expand-define (C-c C-e C-d) mengembangkan makro dalam definisi semasa
  • bee-expand-last-sexp (C-c C-e C-l) mengembangkan makro dalam ungkapan sebelum kursor;
  • bee-expand-toplevel-sexp (C-c C-e C-t) mengembangkan makro dalam ungkapan semasa.

Untuk menyusun atur cara, anda mesti mempunyai Makefile yang menerangkan kebergantungan antara modul dan menentukan bendera kompilasi. Projek ini memerlukan direktori akar yang dipanggil - mod lebah cuba untuk menentukan direktori akar projek dengan mencari salah satu fail Makefile , .afile , atau .etags, atau direktori akar boleh ditetapkan menggunakan ude-user-set-root-directory (C-c C-p C-r) fungsi atau fungsi yang sesuai butang bar alat.

Setelah direktori akar telah ditentukan, Makefile boleh dijana menggunakan fungsi ude-generate-makefile (C-c C-c a atau C-c C-c C-l), yang akan meminta pengguna untuk nama laksana yang mana kod sumber yang diberikan akan dimasukkan. disusun. Jika Makefile sudah wujud, maka pintasan papan kekunci yang sama ini akan mengemas kininya dan juga membina semula fail .afile dan .etags. Di samping itu, terdapat satu set fungsi untuk mengedit Makefile - ude-edit-makefile (C-c C-c e), mengemas kini Makefile - ude-update-makefile (C-c C-c u), menukar antara versi nyahpepijat dan keluaran program - ude- makefile-debug-mod (C-c C-c C-d) & ude-makefile-final-mod (C-c C-c C-f) dan lain-lain.

Setelah Makefile wujud, adalah mungkin untuk menyusun kod menggunakan fungsi ude-mode-compile-from-menu (C-c C-c C-c). Anda boleh mengganggu kompilasi menggunakan fungsi kompilasi bunuh (C-c C-c k).

Dan selepas penyusunan selesai, anda boleh melaksanakan boleh laku menggunakan fungsi ude-execute (C-c C-c C-r).

Penyahpepijatan dan Pemprofilan

Pakej Bigloo juga disertakan dengan penyahpepijat yang membolehkan anda menyahpepijat pada tahap kod sumber. mod lebah menyokong interaksi dengan penyahpepijat ini dalam Emacs. Untuk melancarkan penyahpepijat, anda perlu melaksanakan fungsi nyahpepijat lebah (C-c C-b C-b) atau pilih ikon bar alat atau item menu yang sesuai. Tetapi melancarkan penyahpepijat tidak menyambungkannya secara automatik, jadi anda perlu melaksanakan secara eksplisit fungsi bee-toggle-connect-buffer (C-c C-b c) untuk mengikat penimbal semasa kepada penyahpepijat, yang akan membolehkan anda menetapkan titik putus dan melakukan yang lain. tugas semasa dalam penimbal teks sumber .

Pemprofilan program disokong secara automatik jika anda menggunakan penjanaan Makefile. Untuk kod profil, anda mesti menyusunnya terlebih dahulu dengan sokongan pemprofilan, yang dilakukan dengan fungsi permulaan profil-lebah (C-c C-p c). Dan selepas penyusunan, anda boleh menjalankan bee-profiler-inspect (C-c C-p i), yang akan menjalankan program, dan kemudian menjalankan utiliti bglprof, yang akan mengumpul data pelaksanaan untuk anda analisis.

Fungsi lain

Pakej ini memberi peluang untuk mendapatkan maklumat rujukan. Ini boleh dilakukan dengan menjalankan fungsi bee-doc-visit (C-c C-d i) atau dengan mengklik pada ikon Maklumat dalam bar alat. Fungsi ini berkelakuan berbeza bergantung pada kedudukan semasa kursor - jika kursor berada pada pengecam, maka dokumentasi untuk pengecam ini dipaparkan, jika rantau kod dipilih, maka dokumentasi untuk wilayah ini akan dikeluarkan. Jika tidak, pengguna akan digesa untuk nama bahagian dokumentasi yang diminati, dan bahagian yang dipilih akan ditunjukkan.

Maklumat yang ditunjukkan kepada pengguna diambil daripada fail Maklumat yang disertakan dengan Bigloo. Selain itu, dokumentasi dicari dalam direktori projek semasa dan ia ditambah secara automatik. Selain itu, pengguna boleh menentukan fail dokumentasi tambahan untuk dicari.

Beg plastik bmacs juga menyediakan beberapa fungsi untuk bekerja dengan sistem kawalan versi, yang membolehkan anda beroperasi dengan data pada peringkat projek. Tetapi disebabkan kemunculan sistem kawalan versi baharu dan antara muka yang sepadan untuk mereka, fungsi ini tidak begitu dalam permintaan.

Di samping itu, terdapat banyak ciri tambahan yang dilaksanakan oleh pakej ini, sebagai contoh, sokongan untuk bekerja dengan kod yang ditulis dalam C, dsb., tetapi penerangan tentang ciri ini berada di luar skop artikel ini.

Sokongan skim dalam SLIME

Untuk kegunaan LENDIR dengan Skim, anda perlu melakukan beberapa persediaan pakej asas seperti yang diterangkan dalam bahagian pakej dan kemudian memuat turun komponen yang diperlukan. Secara umum, ini dilakukan seperti berikut:

(add-hook "slime-load-hook (lambda() (memerlukan "slime-scheme)))

Perintah ini akan memasang cangkuk yang diperlukan untuk berfungsi LENDIR, tetapi untuk setiap dialek yang disokong anda mungkin perlu melakukan konfigurasi tambahan mengikut arahan dalam fail yang sepadan - swank-kawa.scm atau swank-mit-scheme.scm .

Dan segala-galanya yang berkaitan dengan bekerja dengan LENDIR, diterangkan dalam bahagian yang sepadan.

Secara lalai, hanya satu proses Skim dibenarkan untuk dijalankan. Tetapi anda boleh menggunakan pakej jika anda perlu menjalankan beberapa proses pada masa yang sama.

Selain itu, penghantaran bmacs pakej juga disediakan cee, bertujuan untuk mengedit kod C yang digunakan untuk menulis sambungan Bigloo, mod pepijat, yang menyediakan sokongan untuk penyahpepijat Bigloo, dan ude(Persekitaran Pembangunan Unix), yang menyediakan sokongan untuk penyusunan dan pelbagai utiliti yang digunakan dalam bekerja dengan Bigloo.

Perlu diingat bahawa jika Makefile tidak wujud, maka fungsi ini menyebabkan penyusunan modul boleh laku bermula dari satu fail.

kononnya angkuh-modul.

Semua komponen yang berkaitan dengan Skim terletak dalam subdirektori sumbangan pengedaran SLIME, jadi jangan lupa untuk menambahkannya pada laluan carian anda.