2009-10-08 35 views
49

我在第一天自學計劃1。不用說,我什麼都不懂。所以,我在讀的小策士和使用這個東西:Lisp/Scheme中的'(撇號)是什麼?

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

當翻譯。

我需要在使用'例如

(atom? 'turkey) 

,以避免「未定義的變量」錯誤。根據這本書,'是一個Common Lisp的東西。

我有兩個問題:

  1. 是我上面一個好的提到的翻譯嗎?你能推薦另一個嗎?我需要一個能與小Schemer一起順利的人。

  2. 什麼是'

+1

「我需要」避免「未定義的變量」錯誤「 - 如果你正在寫這種方式,你的方法有些嚴重缺陷,儘管我不能說什麼。建議您仔細閱讀較舊的R4RS標準(附錄除外;比R5RS或R6RS更容易獲得)三次。 – 2009-10-13 12:49:29

回答

47

形式'foo是簡單地鍵入特殊形式

(quote foo) 

這是說,「不評價的名字foo和與它的值替換它更快的方法,我真正的意思了名稱富「。

我認爲SISC對於探索TLS練習來說是完美無缺的。

+0

報價和函數之間沒有功能差異嗎?即:加熱/冷卻規則。當foo被傳遞給一個函數時,它首先被評估,而引用代碼的目的是阻止它的評估。 – 2017-09-29 20:13:34

13

SISC很好,但更輕量級的在線Scheme執行器是http://codepad.org。它實際上並不是一個REPL,它不是互動的,但它非常接近。您提交的代碼在服務器一側執行,而不是使用瀏覽器小程序。你可以通過短網址分享你正在運行的代碼。

鍵盤上的about頁面說它使用「MzScheme v372 [cgc]」。

我使用鍵盤進行各種快速片段測試(包括針對SO答案的測試代碼示例!)。

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

這顯示:

對於報價的語法,所述差異可以使用這樣的代碼可以看出

 
5 
x 

在第一種情況,x被評估並傳遞給display,這打印5.在第二種情況下,符號x(與字符串不一樣)傳遞給display,打印名稱爲o f符號。

22

您需要了解Scheme的基本評估規則。

首先

(atom? 'turkey) 

該列表是一個功能應用,所以atom?被計算爲一個功能。 'turkey(quote turkey)的簡寫符號。評估(quote turkey)給出了符號turkey

所以接下來該函數應用於符號turkey並計算返回值。

(atom? turkey) 

再次,我們有一個功能應用和atom?被計算爲一個功能。這一次turkey是一個變量。評估turkey給出了綁定它的值 - 它究竟是什麼。

那麼這個函數被應用於變量turkey的值。

摘要

turkey是一個變量,它獲取評價它的值。 'turkey(quote turkey),其被評估爲符號turkey

Scheme重用s表達式並用s表達式構建它的程序。這導致問題有時turkey應該是一個變量,有時它應該是符號。這對初學者來說有點混淆。一段時間後,你會看到它背後的力量。

3
  1. 我建議你移動到一個更好的環境,比如PLT Scheme,它有一個IDE,調試器和大量庫。隨着您前進並開始編寫更大的程序,您將需要它們。

  2. 單引號字符是用於「引用」表達式的語法糖,所以'土耳其與(土耳其語)是一樣的。基本上,「引用」所做的就是關閉Scheme評估器。換句話說,「引用」會逐字返回表達式。如果沒有「報價」,那麼Scheme將嘗試在當前環境中評估「火雞」。這不是一個Common Lisp的東西,而是一個Lisp的東西。 Common Lisp和Scheme是Lisp的兩種方言。所有Lisp教程/書籍都解釋了「quote」的用法。另請參閱this question的答案。

3

單引號字符是一種簡寫的方式(quote foo),其中引號是隻返回foo而不計算它的形式。

在Scheme或任何Lisp中真正記住的一件事是,默認情況下,所有事情都會被評估。所以,如果你不想評估你需要一種方法來解決這個問題。

引用一些東西就是這樣,單引號只需要較少的打字並導致較少的冗長代碼。

+0

恩,並非所有的東西都是默認評估的。在'(如果t(一)(二))',(二)永遠不會被評估。一切只在頂層或函數的參數中被默認評估。如果它是*其他任何地方*,它可能會或可能不會被評估,具體取決於特定*其他地方*的位置。 – enrey 2016-07-28 07:57:36

1

如果您正在尋找最適合scheme的IDE,那麼請去Dr Racket。但是當開始Dr Racket 第一行應該是#lang scheme,因爲Dr Racket有很多語言,我們已經明確提到了我們要使用哪種語言。

當我們想傳遞一個參數本身而不是傳遞參數的值時,我們使用quote。它主要與在使用C編程語言中沒有的列表,對和原子期間傳遞的過程有關(大多數人使用C編程開始編程,因此我們感到困惑)這是Scheme編程語言中的代碼,它是lisp的一種方言我想你可以理解這段代碼。

(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 

最後一行(原子?「ABC)被傳遞ABC,因爲它是該過程檢查是否ABC是原子或沒有,但是當你經過(原子?ABC),那麼它檢查該值的abc並將其值傳遞給它。因爲,我們還沒有向它提供

3

速記(quote ...)任何價值,'轉碼成數據。

stuff是一個符號,這意味着它可以是一個變量或函數的名稱等的名稱..
'stuff給你的符號「東西」本身。

(dostuff "on" those 4 :parameters)評估時,將運行函數dostuff有四個參數:字符串,變量內容,數字和關鍵字。
'(dostuff "on" those 4 :parameters)評價時將返回上面的代碼,其中,評價時,將反過來運行功能dostuff與四個參數..

例如: 運行'''somecode,它返回''somecode。運行''somecode,它返回'somecode。運行'somecode,它返回somecode。運行somecode,並且...好吧... somecode將運行。

可以說,'有點像的(eval..)相反。

(eval (eval (eval '''(print "hello"))))會打印「你好」。
(eval (eval (eval ''''(print "hello"))) - 發現多了一個'然後eval - 不會顯示任何信息,但它會返回代碼(print "hello")本身!

除了lispers往往調用返回的代碼(有時甚至是手寫代碼)「名單」而不是「代碼」,爲將要出血原因很明顯,你只挖一個深一點。祝你好運:)

+0

不,在方案(而不是普通的lisp)東西是一個標識符。它通過引用它成爲一個象徵,就像'東西。一個小點,但它是正確的很好。在方案中,標識符不需要像通用的lisp那樣被實現爲符號。有關最新的方案標準,請參閱r7rs的§2.1和§6.5。 – 2017-09-05 21:07:35