2 poin oleh GN⁺ 2024-05-13 | 1 komentar | Bagikan ke WhatsApp

Mengimplementasikan "Lisp in Lisp" karya McCarthy dengan Python

  • Lisp, yang dikembangkan oleh John McCarthy pada awal 1960-an, memiliki sifat homoiconicity sehingga kode dan data dapat saling dipertukarkan

    • Di Lisp, batas antara kode dan data menjadi kabur
    • Dengan ini, Lisp dapat merepresentasikan dirinya sendiri secara alami
  • Setengah halaman kode di bagian bawah halaman 13 manual Lisp 1.5 adalah Lisp itu sendiri

    • Alan Kay menyebutnya sebagai "persamaan Maxwell perangkat lunak"
    • Seluruh dunia pemrograman dipadatkan ke dalam hanya beberapa baris kode
  • Untuk memahaminya, salah satu cara yang baik adalah mengimplementasikan ulang kode "Lisp in Lisp" menggunakan Python

    • Kebanyakan programmer tidak terbiasa dengan sintaks Lisp, tetapi kemungkinan sudah akrab dengan sintaks Python
    • Tujuannya adalah menulis ulang ke Python sambil sebisa mungkin mempertahankan semangat kode Lisp

M-expression dan S-expression di Lisp

  • Lisp pada awalnya memiliki dua flavor sintaks

    • M-expression (meta expression): flavor kode
    • S-expression (symbolic expression): flavor data
    • Keduanya setara secara semantik
  • Kode "Lisp in Lisp" ditulis dalam M-expression, dan mengimplementasikan Lisp berbasis S-expression

  • Salah satu caranya adalah mengubah M-expression Lisp ke struktur kode Python, dan merepresentasikan S-expression sebagai list Python

    • Lisp adalah singkatan dari List Processing, sehingga hanya menggunakan satu struktur data tunggal berupa list

Implementasi pertama

  • Operasi dasar Lisp diimplementasikan dengan fungsi-fungsi dasar list Python

    • atom(x): memeriksa apakah x adalah list
    • eq(x,y): memeriksa apakah x dan y sama
    • car(x): mengembalikan elemen pertama dari list
    • cdr(x): mengembalikan sisa bagian list
    • cons(x,y): menambahkan atom ke list
    • append(x,y): menggabungkan dua list
  • Dengan mengabaikan beberapa elemen dasar rekursi dan dibantu Llama3-70b, interpreter untuk subset kode "Lisp in Lisp" dapat diimplementasikan dengan cepat

Implementasi kedua

  • Pada implementasi pertama, fitur lambda belum ada

    • Lambda adalah cara utama di Lisp untuk mendefinisikan dan memanggil fungsi
    • Tanpa lambda, rekursi tidak bisa diimplementasikan, dan tanpa rekursi sistemnya tidak Turing-complete
  • Untuk mengimplementasikan lambda, diperlukan elemen dasar assoc(x,y) dan pairlis(x,y)

    • assoc(x,y) adalah lookup kamus key/value menggunakan association list
    • pairlis(x,y) sama seperti zip(x,y) di Python
  • Lisp tidak memiliki loop, sehingga bahkan pencarian linear sederhana pun harus menggunakan rekursi

    • Namun di Python, ini bisa diubah dengan elegan menggunakan list comprehension
    • Hal yang sama berlaku untuk evcon dan evlis, yang juga bisa diubah menjadi loop
  • Fungsi eval pada Lisp asli menerima dua argumen

    • Yang pertama adalah expression (s-exp), yang kedua adalah environment, yaitu list key/value
    • Environment mempertahankan variable binding milik LAMBDA
    • Menggunakan teknik dynamic scoping

Opini GN⁺

  • Ini adalah upaya menarik untuk meniru sifat homoiconicity Lisp di Python. Namun, tampaknya ada batasan dalam memindahkan sepenuhnya karakteristik unik Lisp. Jika ingin merasakan daya tarik Lisp, belajar Lisp itu sendiri tampaknya tetap menjadi cara terbaik.

  • Mengesankan bahwa fitur-fitur kuat Lisp seperti fungsi lambda dan dynamic scoping diimplementasikan di Python. Namun, tampaknya masih banyak kekurangan untuk diterapkan pada proyek nyata. Untuk tujuan edukasi atau riset, pendekatan ini terlihat bernilai.

  • Upaya seperti ini sendiri bisa menjadi kesempatan untuk berpikir lebih dalam tentang hakikat bahasa pemrograman. Terlepas dari sintaks dan implementasi bahasa, ini dapat memberi sudut pandang untuk melihatnya dari perspektif paradigma pemrograman.

  • Mempelajari bahasa keluarga Lisp dapat membantu memperoleh wawasan tentang functional programming dan metaprogramming. Menengok bahasa Lisp modern seperti Scheme, Clojure, dan Racket juga tampak layak dilakukan.

1 komentar

 
kayws426 2024-05-13

Dialek Lisp yang ditanamkan di dalam Python
https://hylang.org/