我在第一天自學計劃1。不用說,我什麼都不懂。所以,我在讀的小策士和使用這個東西:Lisp/Scheme中的'(撇號)是什麼?
當翻譯。
我需要在使用'
例如
(atom? 'turkey)
,以避免「未定義的變量」錯誤。根據這本書,'
是一個Common Lisp的東西。
我有兩個問題:
是我上面一個好的提到的翻譯嗎?你能推薦另一個嗎?我需要一個能與小Schemer一起順利的人。
什麼是
'
?
我在第一天自學計劃1。不用說,我什麼都不懂。所以,我在讀的小策士和使用這個東西:Lisp/Scheme中的'(撇號)是什麼?
當翻譯。
我需要在使用'
例如
(atom? 'turkey)
,以避免「未定義的變量」錯誤。根據這本書,'
是一個Common Lisp的東西。
我有兩個問題:
是我上面一個好的提到的翻譯嗎?你能推薦另一個嗎?我需要一個能與小Schemer一起順利的人。
什麼是'
?
形式'foo
是簡單地鍵入特殊形式
(quote foo)
這是說,「不評價的名字foo和與它的值替換它更快的方法,我真正的意思了名稱富「。
我認爲SISC對於探索TLS練習來說是完美無缺的。
報價和函數之間沒有功能差異嗎?即:加熱/冷卻規則。當foo被傳遞給一個函數時,它首先被評估,而引用代碼的目的是阻止它的評估。 – 2017-09-29 20:13:34
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符號。
您需要了解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
應該是一個變量,有時它應該是符號。這對初學者來說有點混淆。一段時間後,你會看到它背後的力量。
我建議你移動到一個更好的環境,比如PLT Scheme,它有一個IDE,調試器和大量庫。隨着您前進並開始編寫更大的程序,您將需要它們。
單引號字符是用於「引用」表達式的語法糖,所以'土耳其與(土耳其語)是一樣的。基本上,「引用」所做的就是關閉Scheme評估器。換句話說,「引用」會逐字返回表達式。如果沒有「報價」,那麼Scheme將嘗試在當前環境中評估「火雞」。這不是一個Common Lisp的東西,而是一個Lisp的東西。 Common Lisp和Scheme是Lisp的兩種方言。所有Lisp教程/書籍都解釋了「quote」的用法。另請參閱this question的答案。
單引號字符是一種簡寫的方式(quote foo),其中引號是隻返回foo而不計算它的形式。
在Scheme或任何Lisp中真正記住的一件事是,默認情況下,所有事情都會被評估。所以,如果你不想評估你需要一種方法來解決這個問題。
引用一些東西就是這樣,單引號只需要較少的打字並導致較少的冗長代碼。
恩,並非所有的東西都是默認評估的。在'(如果t(一)(二))',(二)永遠不會被評估。一切只在頂層或函數的參數中被默認評估。如果它是*其他任何地方*,它可能會或可能不會被評估,具體取決於特定*其他地方*的位置。 – enrey 2016-07-28 07:57:36
如果您正在尋找最適合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並將其值傳遞給它。因爲,我們還沒有向它提供
速記(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往往調用返回的代碼(有時甚至是手寫代碼)「名單」而不是「代碼」,爲將要出血原因很明顯,你只挖一個深一點。祝你好運:)
不,在方案(而不是普通的lisp)東西是一個標識符。它通過引用它成爲一個象徵,就像'東西。一個小點,但它是正確的很好。在方案中,標識符不需要像通用的lisp那樣被實現爲符號。有關最新的方案標準,請參閱r7rs的§2.1和§6.5。 – 2017-09-05 21:07:35
「我需要」避免「未定義的變量」錯誤「 - 如果你正在寫這種方式,你的方法有些嚴重缺陷,儘管我不能說什麼。建議您仔細閱讀較舊的R4RS標準(附錄除外;比R5RS或R6RS更容易獲得)三次。 – 2009-10-13 12:49:29