Tôi nên học gì từ Đề án?


10

Tôi đã tự hỏi những tính năng độc đáo nào tôi có thể học được từ Scheme sẽ giúp tôi trở thành một lập trình viên tốt hơn?

Tôi có nhiều kinh nghiệm trong các ngôn ngữ chính, và tôi đang tìm cách mở rộng tầm nhìn của mình và tìm hiểu về các khía cạnh chức năng còn thiếu từ các ngôn ngữ khác. Tôi quen thuộc với các bao đóng từ javascript, lambda từ C # và tôi đã tự hỏi những gì tôi có thể tập trung vào đó là thiếu ngôn ngữ khác? Ngoài cú pháp Lisp, tôi cảm thấy như những gì tôi đã thấy cho đến nay tôi đã gặp trong các ngôn ngữ khác.

Điều gì là duy nhất đối với Scheme / Lisp sẽ dạy tôi điều gì đó mới mẻ?


3
Lisp đáng để học hỏi cho trải nghiệm giác ngộ sâu sắc mà bạn sẽ có khi cuối cùng bạn có được nó; trải nghiệm đó sẽ giúp bạn trở thành một lập trình viên tốt hơn trong những ngày còn lại, ngay cả khi bạn không bao giờ thực sự sử dụng chính Lisp. - Eric Raymond
Robert Harvey

1

1
@Robert Harvery: Ngoài ra: xkcd.com/224
Poindexter

2
Ở dạng hiện tại, câu hỏi này không đặc biệt mang tính xây dựng. Nếu bạn có thể làm lại nó để yêu cầu thông tin cụ thể hơn, nó có thể hữu ích.
ChrisF

Xem thêm Dạy ngôn ngữ lập trình trong thời đại hậu Linna và sách giáo khoa mà tài liệu này tham khảo: Ngôn ngữ lập trình: Ứng dụng và diễn giải , sử dụng Ngôn ngữ vợt , một phương ngữ của lược đồ.
Robert Harvey

Câu trả lời:


7

Có lẽ đặc điểm xác định quan trọng nhất của Lisp là "Mã là dữ liệu".  Bạn sẽ không có được trải nghiệm đó theo cách tương tự với bất kỳ ngôn ngữ nào khác. Trong C #, tương tự gần nhất là cây biểu thức.

Chính chất lượng đó làm cho Lisp trở thành một ngôn ngữ tuyệt vời để phân tích cú pháp. Đó cũng là phẩm chất thúc đẩy Paul Graham nói về Lisp: "Điều khác thường về Lisp-- thực tế, chất lượng định nghĩa của Lisp-- là nó có thể được viết bằng chính nó." Mặc dù trình biên dịch tự lưu trữ không có gì mới, nhưng không có ngôn ngữ nào làm điều đó hoàn toàn thanh lịch như Lisp.

Metaprogramming (một cái gì đó trong đó Lisp cũng vượt trội) cũng là một điều đáng để học hỏi.

Đánh bại mức trung bình của Paul Graham
http://www.paulgraham.com/avg.html


1
Tôi nghĩ rằng lý do tôi không bao giờ có "aha!" Khoảnh khắc mà ESR hứa với tôi là tôi đã có tiết lộ "mã dưới dạng dữ liệu" trong Prolog.
Frank Shearar

1
Haskell có thuộc tính "code as data" không? Hay vẻ đẹp phụ thuộc rất nhiều vào cách đánh máy và phản xạ năng động?
Joey Adams

1
@Joey: Tôi nghĩ rằng thực tế là Mẫu Haskell tồn tại có nghĩa là Haskell thiếu thuộc tính "mã là dữ liệu".
j_random_hacker

4

Vâng, nó sẽ giúp bạn suy nghĩ một cách đệ quy. Tôi chỉ học nó (sơ đồ) trong một tháng hoặc lâu hơn trong một lớp ngôn ngữ lập trình và nó đã giúp tôi phát triển cách tôi suy nghĩ và giải quyết các vấn đề lập trình.

Nó luôn luôn có giá trị để thử các mô hình lập trình khác; sau đó bạn trở lại làm mới với thế giới OO với những ý tưởng mới.

Không phải cú pháp, nhưng lý luận, nó là bài tập não tuyệt vời. Sau khi đệ quy và sử dụng danh sách thú vị, không có nhiều IMHO khác, nhưng nó rất đáng giá.


Không phải là duy nhất cho chương trình. Bất kỳ (tốt, gần như bất kỳ) ngôn ngữ chức năng là tốt để thực hiện đệ quy.

Tôi đồng ý, nhưng OP có vẻ quan tâm đến Đề án so với các ngôn ngữ 'chính thống' ....
Xavier Nodet

1

Tiếp tục :

Trong khoa học máy tính và lập trình, phần tiếp theo là một đại diện trừu tượng về trạng thái điều khiển của chương trình máy tính. Việc tiếp tục điều chỉnh trạng thái điều khiển chương trình, tức là việc tiếp tục là một cấu trúc dữ liệu đại diện cho quá trình tính toán tại một điểm nhất định trong quá trình thực thi quy trình; cấu trúc dữ liệu được tạo có thể được truy cập bằng ngôn ngữ lập trình, thay vì bị ẩn trong môi trường thời gian chạy. Nó chứa thông tin như stack ngăn xếp hiện tại của quy trình (bao gồm tất cả dữ liệu có thời gian tồn tại trong quy trình, ví dụ: "biến cục bộ"), cũng như điểm của quy trình trong tính toán. Một thể hiện của sự tiếp tục sau này có thể được sử dụng như một cấu trúc điều khiển; khi gọi, nó sẽ tiếp tục thực hiện từ điểm kiểm soát mà nó đại diện. "Tiếp tục hiện tại"

và sau đó cố gắng thực hiện Toán tử mơ hồ của McCarthy :

Năm 1963 John McCarthy, nhà phát minh của Lisp, đã xuất bản bài báo Một cơ sở cho một lý thuyết toán học trong đó ông đề xuất chức năng (theo nghĩa chương trình máy tính của từ này) amb (.,.). Ý tưởng là amb (x, y) trước tiên bằng x. Nhưng nếu sau này trong tính toán, người ta thấy rằng điều này dẫn đến một số mâu thuẫn, giá trị của x được rút lại và thay thế bằng y. Đây là một doanh nghiệp phức tạp hơn nhiều so với lúc đầu. Rút lại một giá trị về cơ bản có nghĩa là cuộn lại toàn bộ trạng thái tính toán về vị trí của nó khi amb trả về giá trị x, và sau đó trượt vào giá trị của y. Điều này có nghĩa là bằng cách nào đó đóng băng và sao chép toàn bộ trạng thái khi x được trả lại lần đầu tiên. Khi tìm thấy mâu thuẫn, toàn bộ trạng thái của chương trình bị loại bỏ và được thay thế bằng phiên bản đóng băng được kích hoạt lại. Những trạng thái đóng băng này được gọi là tiếp tục. Theo nhiều cách, nó giống như một tuyên bố GOTO về axit. Nó có thể gây ra một bước nhảy đến một điểm tùy ý trên mã của bạn. Nhưng các phần tiếp theo đẹp hơn GOTO vì chúng dễ sửa đổi theo lý luận hợp lý hơn.


1

Tôi có thể nghĩ về những điều sau đây:

  • Các macro thực (sử dụng toàn bộ sức mạnh của ngôn ngữ để tạo mã)
  • Homoiconicity (dữ liệu dưới dạng mã, mã là dữ liệu)
  • Đánh giá lười biếng
  • Tiếp tục

Tôi cũng nghĩ rằng các ngôn ngữ lisp nên là tuyệt vời để xác định ngôn ngữ cụ thể miền (DSL). Đó là điều bạn có thể muốn đọc nếu bạn chưa biết về nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.