2009-10-08 37 views
49

Tôi đang đi học vào ngày 1 giờ 1 để tự học. Không cần phải nói, tôi không hiểu gì cả. Vì vậy, tôi đang đọc The Little âm mưu và sử dụng điều này:'apostrophe' trong Lisp/Scheme là gì?

http://sisc-scheme.org/sisc-online.php

như một thông dịch viên.

tôi cần phải sử dụng ' trong ví dụ

(atom? 'turkey) 

để tránh lỗi "biến không xác định". Các ', theo cuốn sách, là một điều Lisp thường gặp.

Tôi có hai câu hỏi:

  1. là người phiên dịch tôi đã đề cập ở trên một trong những tốt? Bạn có thể giới thiệu một cái khác không? Tôi cần một thiết bị phù hợp với The Little Schemer.

  2. ' là gì?

+1

"Tôi cần" để tránh lỗi "biến không xác định" - điều gì đó thiếu sót nghiêm trọng về cách tiếp cận của bạn nếu bạn đang viết theo cách này, mặc dù tôi không thể nói gì. Đề nghị bạn đọc kỹ tiêu chuẩn R4RS cũ hơn (ngoại trừ phụ lục; nó dễ tiếp cận hơn R5RS hoặc R6RS) ba lần. –

Trả lời

47

Dạng 'foo chỉ đơn giản là một cách nhanh hơn để gõ các hình thức đặc biệt

(quote foo) 

mà là để nói, "không đánh giá tên foo và thay thế bằng giá trị của nó, tôi thực sự có nghĩa là tên foo ".

Tôi nghĩ SISC là hoàn toàn tốt để khám phá các bài tập trong TLS.

+0

Không có sự khác biệt về chức năng giữa báo giá và chức năng? Cụ thể là: các quy tắc làm nóng/làm mát. Khi foo được chuyển vào một hàm, nó được đánh giá đầu tiên, trong khi đó, điểm của mã trích dẫn là giữ lại đánh giá của nó. –

13

SISC là tốt, nhưng trình quản lý Đề án trực tuyến thậm chí còn nhẹ hơn là http://codepad.org. Nó không thực sự là một REPL trong đó nó không tương tác, nhưng nó khá gần. Mã bạn gửi được thực hiện trên máy chủ thay vì sử dụng một applet trình duyệt. Và bạn có thể chia sẻ mã mà bạn đang chạy bằng URL ngắn.

Trang about trên bảng mã cho biết nó sử dụng "MzScheme v372 [cgc]".

Tôi sử dụng bảng mã cho tất cả các loại thử nghiệm đoạn trích nhanh (bao gồm cả các mẫu mã thử nghiệm cho các câu trả lời SO!).

Đối với cú pháp quote, sự khác biệt có thể được nhìn thấy sử dụng mã như thế này:

(let ((x 5)) 
    (display x) (newline) 
    (display 'x) (newline)) 

này hiển thị:

 
5 
x 

Trong trường hợp đầu tiên, x được đánh giá và thông qua để display, mà bản in 5. Trong trường hợp thứ hai, biểu tượng x (không giống như chuỗi ký tự) được chuyển đến display, in tên o f biểu tượng.

22

Bạn cần hiểu các quy tắc đánh giá cơ bản của Đề án.

Đầu tiên:

(atom? 'turkey) 

Danh sách này là một ứng dụng chức năng, vì vậy atom? được đánh giá để một hàm. 'turkey là ký pháp viết tay ngắn cho (quote turkey). Đánh giá (quote turkey) cho biểu tượng turkey.

Vì vậy, tiếp theo hàm được áp dụng cho các biểu tượng turkey và một giá trị trả về được tính.

Second

(atom? turkey) 

lần nữa chúng ta có một ứng dụng chức năng và atom? được đánh giá để một hàm. Lần này turkey là một biến. Đánh giá turkey cho giá trị được ràng buộc với nó - nó là bao giờ.

Vì vậy, sau đó hàm được áp dụng cho các giá trị của biến turkey.

Tóm tắt

turkey là một biến, mà được đánh giá giá trị của nó. 'turkey(quote turkey), được đánh giá thành ký hiệu turkey.

Đề án sử dụng lại các biểu thức s và xây dựng các chương trình của nó từ biểu thức. Điều này dẫn đến vấn đề mà đôi khi turkey phải là một biến và đôi khi nó phải là biểu tượng. Điều này hơi gây nhầm lẫn cho người mới bắt đầu. Sau một thời gian bạn sẽ thấy sức mạnh đằng sau nó.

3
  1. Tôi khuyên bạn nên chuyển sang môi trường tốt hơn như PLT Scheme, có IDE, trình gỡ lỗi và nhiều thư viện. Khi bạn tiến lên và bắt đầu viết các chương trình lớn hơn, bạn sẽ cần chúng.

  2. Ký tự đơn trích dẫn là cú pháp đường cho biểu thức "trích dẫn", vì vậy 'gà tây giống như (gà tây báo giá). Về cơ bản, những gì "quote" làm là tắt bộ đánh giá Scheme. Nói cách khác, "quote" trả về biểu thức, nguyên văn. Nếu không có "báo giá", thì Đề án sẽ cố gắng đánh giá "gà tây" trong môi trường hiện tại. Đây không phải là một điều Lisp thường gặp nhưng là một điều Lisp. Lisp và Scheme chung là hai phương ngữ của Lisp. Việc sử dụng "quote" được giải thích trong tất cả các hướng dẫn/sách Lisp. Đồng thời xem câu trả lời cho this question.

3

Ký tự đơn là cách viết tắt (quote foo) trong đó báo giá là biểu mẫu để trả về chỉ mà không đánh giá nó.

Một điều cần nhớ rõ lắm trong Đề án hoặc bất kỳ Lisp cho rằng vấn đề là mọi thứ đều được đánh giá theo mặc định. Vì vậy, trong trường hợp bạn không muốn đánh giá bạn cần một cách để ngồi này.

Trích dẫn một cái gì đó không chỉ này và các đơn quote chỉ là đòi hỏi ít đánh máy và dẫn đến mã ít tiết.

+0

Emm, không phải mọi thứ đều được đánh giá theo mặc định. Trong '(nếu t (một) (hai))', (hai) không bao giờ được đánh giá. Mọi thứ được đánh giá theo mặc định chỉ ở cấp cao nhất hoặc trong các tham số của một hàm. Nếu đó là * ở bất kỳ nơi nào khác *, nó có thể hoặc không thể được đánh giá, tùy thuộc vào vị trí chính xác của nó * ở bất kỳ nơi nào khác *. – enrey

1

Nếu bạn tìm kiếm một IDE tốt nhất cho scheme sau đó đi cho Dr Racket.Nhưng khi bắt đầu Dr Racket dòng đầu tiên phải là #lang schemeDr Racket có nhiều ngôn ngữ, chúng tôi đã đề cập rõ ràng ngôn ngữ nào chúng tôi sẽ sử dụng.

Khi chúng tôi muốn chuyển một đối số thay vì chuyển giá trị của đối số thì chúng tôi sử dụng báo giá. Nó chủ yếu liên quan đến thủ tục truyền trong quá trình sử dụng danh sách, cặp và nguyên tử không có sẵn trong ngôn ngữ lập trình C (hầu hết mọi người bắt đầu lập trình bằng lập trình C, Do đó chúng ta bị lẫn lộn). Đây là mã trong ngôn ngữ lập trình Scheme. và tôi đoán bạn có thể hiểu mã này.

(define atom?    ; defining a procedure atom? 
(lambda (x)    ; which as one argument x 
(and (not (null? x)) (not(pair? x))))) ; checks if the argument is atom or not 
(atom? '(a b c)) ; since it is a list it is false #f 

Dòng cuối cùng (nguyên tử? 'Abc) được thông qua abc vì nó là thủ tục để kiểm tra xem abc là một nguyên tử hay không, nhưng khi bạn vượt qua (nguyên tử? Abc) sau đó nó kiểm tra các giá trị của abc và truyền giá trị cho nó. Vì chúng tôi chưa cung cấp bất kỳ giá trị nào cho nó

3

Viết tắt cho (quote ...), ' chuyển mã thành dữ liệu.

stuff là một biểu tượng, có nghĩa là nó có thể là một tên của một biến hoặc tên của một hàm, vv ..
'stuff mang đến cho bạn những biểu tượng "công cụ" riêng của mình.

(dostuff "on" those 4 :parameters) khi được đánh giá, sẽ chạy hàm dostuff với bốn thông số: chuỗi, nội dung của biến đó, số và từ khóa.
'(dostuff "on" those 4 :parameters) khi đánh giá sẽ trở lại các mã trên, trong đó, khi đánh giá, sẽ lần lượt chạy chức năng dostuff với bốn thông số ..

Ví dụ: Run '''somecode, nó sẽ trả ''somecode. Chạy ''somecode, trả về 'somecode. Chạy 'somecode, nó trả về somecode. Chạy somecode và ... tốt ... somecode sẽ chạy.

Bạn có thể nói rằng ' hơi giống với số (eval..).

(eval (eval (eval '''(print "hello")))) sẽ in "Hello".
(eval (eval (eval ''''(print "hello"))) - thông báo thêm một lần nữa ' rồi eval - sẽ không in bất kỳ thứ gì, nhưng nó sẽ trả lại mã số (print "hello") chính nó !!

Ngoại trừ những người nói dối có xu hướng gọi mã trả về đó (và đôi khi ngay cả mã viết tay) "danh sách" thay vì "mã", vì những lý do sẽ xuất hiện rõ ràng khi bạn đào sâu hơn một chút. Chúc may mắn :)

+0

Không, trong sơ đồ (như trái ngược với thông thường lisp) công cụ là một định danh. Nó trở thành một biểu tượng bằng cách trích dẫn nó, như trong 'công cụ. Một điểm nhỏ, nhưng nó là tốt đẹp để làm cho nó đúng.Trong sơ đồ, các định danh không bắt buộc phải được thực hiện như các biểu tượng, như trong lisp thông thường. Đối với chuẩn chương trình mới nhất, xem §2.1 và §6.5 của r7rs. –