亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

7行代碼,3分鐘:從無到有實現一門編程語言
來源:易賢網 閱讀:2228 次 日期:2015-04-02 14:01:51
溫馨提示:易賢網小編為您整理了“7行代碼,3分鐘:從無到有實現一門編程語言”,方便廣大網友查閱!

實現一門編程語言對任何程序員來說都是值得擁有的經驗,因為它能加深你對計算原理的理解,并且還很有趣。

在這篇文章中,我已經讓整個過程回歸到它的本質:為一種函數式(圖靈等價)編程語言設計7行代碼的解釋器。大概只需要3分鐘就能實現

這個7行代碼的解釋器展示了在眾多解釋器中同時存在的一個可升級的體系結構–eval/apply設計模式。Structure and Interpretation of Computer Programs這本書提到過該模式。

在這篇文章中總計有三門語言的實現:

一個是scheme語言的7行,3分鐘實現的解釋器

一個是Racket語言的重實現

最后一個是100行、“1-afternoon”解釋器,它實現了高級綁定形式、顯示遞歸、額外作用、高階函數式等等

對于掌握一門更豐富的語言來說,最后一個解釋器是一個好起點

一個小型(圖靈機等價)語言

最容易實現的一門編程語言是一個叫做λ運算的極簡單、高階函數式編程語言

λ運算實際上存在于所有主要的功能性語言的內核中:Haskell, Scheme、 ML,但是它也存在于JavaScript、Python、Ruby中。它甚至隱藏在Java中,如果你知道到哪里去找它。

歷史簡介

1929年Alonzo Church開發出λ演算

在那時,lambda calculus不被叫做編程語言因為沒有計算機,所以沒有編程的概念。

它僅僅是一個推演函數的數學標記。

幸運的是,Alonzo Church有一個叫作艾倫·圖靈的哲學博士。

艾倫·圖靈定義了圖靈機,圖靈機成了第一個被接受的通用計算機定義

不久后發現lambda calculus和圖靈機是等價的:任何用λ演算描述的功能可以在圖靈機上實現;并且在圖靈機上實現的任何功能可以用λ演算描述

值得注意的是在lambda calculus中僅有三種表達式:變量引用,匿名函數、函數調用

匿名函數:

(λv.e)

匿名函數以”λ-.”標記開始,所以 (λ v . e)函數用來接收一個參數v并返回值e。

如果你用JavaScript編程,格式function (v) { return e ; }是相同的。

函數調用:

(fe)

函數調用用兩個臨近的表達式表示:(f e)

f(e)

在JavaScript中(或者其他任何語言),寫為f(e)

Examples

(λ x . x)

例如:

恒等函數(identity function),僅僅返回它的參數值,簡單地寫為(λ x . x)

((λ x . x) (λ a . a))

我們可以將這個恒等函數應用到一個恒等函數上:

((λ x . x) (λ a . a))(僅返回這個恒等函數本身)

(((λ f . (λ x . (f x))) (λ a . a)) (λ b . b))

這兒有一個更有趣的程序:

(((λ f . (λ x . (f x))) (λ a . a)) (λ b . b))

你能弄清楚它是干嘛的?

等一下!見鬼,這怎么算一門編程語言?

乍一看,這門簡單語言好像缺乏遞歸和迭代,更不用說數字、布爾值、條件語句、數據結構和剩余其他的。這樣的語言怎么可能成為通用的呢?

λ演算實現圖靈機-等價的方式是通過兩種最酷的方式:

邱奇編碼(Church encoding)和Y combinator(美國著名企業孵化器)

((λ f . (f f)) (λ f . (f f)))

我已經寫了兩篇關于Y combinator和邱奇編碼的文章。

但是,你如果不想讀它們的話,我可以明確的告訴你比起你期望的僅一個((λ f . (f f)) (λ f . (f f)))程序來說 有更多的 lambda calculus知識。

表面上開始的程序叫做Ω,如果你嘗試運行它的話,它不會終止(想一下你是否明白其中原因)

實現λ演算

下面是基于Scheme語言標準(R5RS)的7行、3分鐘λ演算解釋器。在術語中,它是一個依賴環境的指示解釋器

; eval takes an expression and an environment to a value

(define (eval e env) (cond

((symbol? e) (cadr (assq e env)))

((eq? (car e) 'λ) (cons e env))

(else (apply (eval (car e) env) (eval (cadr e) env)))))

; apply takes a function and an argument to a value

(define (apply f x)

(eval (cddr (car f)) (cons (list (cadr (car f)) x) (cdr f))))

; read and parse stdin, then evaluate:

(display (eval (read) '())) (newline)

This code will read a program from stdin, parse it, evaluate it and print the result.

(It's 7 lines without the comments and blank lines.)

代碼將從文件中讀入程序、分析、求值最后打印值(這是一段沒有注釋和空白行的7行代碼)

Schema語言的read函數使得詞法分析和語法分析簡單化。只要你想處于語法“平衡圓括號”(符號式)世界里。

(如果不想的話,你必須鉆研語法分析,你可以從我寫的一篇語法分析文章開始)

在Scheme語言中,read函數從文件獲取加括號的輸入并把它分析然后生成樹

函數eval 和 apply構成了解釋器的內核。即使我們使用的是Scheme語言,我們仍給出了函數概念上的“簽名”

eval : Expression * Environment -> Value

apply : Value * Value -> Value

Environment = Variable -> Value

Value = Closure

Closure = Lambda * Environment

eval函數將一個表達式和環境變量賦給一個值。表達式可以是一個變量、λ術語或者是一個應用。

一個環境值是從變量到值的映射,用來定義一個開項的自由變量(開項用來存放出現的沒有綁定的變量)。想一下這個例子,表達式(λ x . z)是開項,因為我們不知道z是什么。

因為我們使用Scheme語言標準(R5RS),所以用聯合列表來定義環境值

閉項是一個函數的編碼,這個函數使用定義自由變量的環境值來匹配lambda 表達式來。換句話說來說,閉項關閉了一個開項

Racket中有一種更簡潔的實現

Racket是Scheme的一種方言,功能齊備強大。它提供了一個整頓解釋器的匹配構造機制。

#lang racket

; bring in the match library:

(require racket/match)

; eval matches on the type of expression:

(define (eval exp env) (match exp

[`(,f ,e) (apply (eval f env) (eval e env))]

[`(λ ,v . ,e) `(closure ,exp ,env)]

[(? symbol?) (cadr (assq exp env))]))

; apply destructures the function with a match too:

(define (apply f x) (match f

[`(closure (λ ,v . ,body) ,env)

(eval body (cons `(,v ,x) env))]))

; read in, parse and evaluate:

(display (eval (read) '())) (newline)

這一種更加龐大,但是理解起來也更容易、更簡單

一門更加龐大的語言

λ演算是一門極小的語言。盡管如此,解釋器eval/apply的設計可以升級到更加龐大的語言。

例如,用大約100行的代碼,我們可以為Scheme本身相當大的一個子集實現解釋器

考慮一門含有不同表達式分類的語言:

變量引用:除x,foo,save_file

數值和布爾類型的常量:除300,3.14,#f。

原語操作:除+,-,<=

條件語句:(if condition if-true if-false)

變量綁定:(let ((var value) ...) body-expr).

遞歸綁定:(letrec ((var value) ...) body-expr)

變量變化:(set! var value)

序列化:(begin do-this then-this).

現在在語言中添加三種高級形式:

函數定義:(define (proc-name var …) expr).

全局定義:(define var expr)

高級表達式:expr

下面是完整的解釋器,包含測試代碼和測試用例:

#lang racket

(require racket/match)

;; Evaluation toggles between eval and apply.

; eval dispatches on the type of expression:

(define (eval exp env)

(match exp

[(? symbol?) (env-lookup env exp)]

[(? number?) exp]

[(? boolean?) exp]

[`(if ,ec ,et ,ef) (if (eval ec env)

(eval et env)

(eval ef env))]

[`(letrec ,binds ,eb) (eval-letrec binds eb env)]

[`(let ,binds ,eb) (eval-let binds eb env)]

[`(lambda ,vs ,e) `(closure ,exp ,env)]

[`(set! ,v ,e) (env-set! env v e)]

[`(begin ,e1 ,e2) (begin (eval e1 env)

(eval e2 env))]

[`(,f . ,args) (apply-proc

(eval f env)

(map (eval-with env) args))]))

; a handy wrapper for Currying eval:

(define (eval-with env)

(lambda (exp) (eval exp env)))

; eval for letrec:

(define (eval-letrec bindings body env)

(let* ((vars (map car bindings))

(exps (map cadr bindings))

(fs (map (lambda _ #f) bindings))

(env* (env-extend* env vars fs))

(vals (map (eval-with env*) exps)))

(env-set!* env* vars vals)

(eval body env*)))

; eval for let:

(define (eval-let bindings body env)

(let* ((vars (map car bindings))

(exps (map cadr bindings))

(vals (map (eval-with env) exps))

(env* (env-extend* env vars vals)))

(eval body env*)))

; applies a procedure to arguments:

(define (apply-proc f values)

(match f

[`(closure (lambda ,vs ,body) ,env)

; =&gt;

(eval body (env-extend* env vs values))]

[`(primitive ,p)

; =&gt;

(apply p values)]))

;; Environments map variables to mutable cells

;; containing values.

(define-struct cell ([value #:mutable]))

; empty environment:

(define (env-empty) (hash))

; initial environment, with bindings for primitives:

(define (env-initial)

(env-extend*

(env-empty)

'(+ - / * &lt;= void display newline)

(map (lambda (s) (list 'primitive s))

`(,+ ,- ,/ ,* ,&lt;= ,void ,display ,newline))))

; looks up a value:

(define (env-lookup env var)

(cell-value (hash-ref env var)))

; sets a value in an environment:

(define (env-set! env var value)

(set-cell-value! (hash-ref env var) value))

; extends an environment with several bindings:

(define (env-extend* env vars values)

(match `(,vars ,values)

[`((,v . ,vars) (,val . ,values))

; =&gt;

(env-extend* (hash-set env v (make-cell val)) vars values)]

[`(() ())

; =&gt;

env]))

; mutates an environment with several assignments:

(define (env-set!* env vars values)

(match `(,vars ,values)

[`((,v . ,vars) (,val . ,values))

; =&gt;

(begin

(env-set! env v val)

(env-set!* env vars values))]

[`(() ())

; =&gt;

(void)]))

;; Evaluation tests.

; define new syntax to make tests look prettier:

(define-syntax

test-eval

(syntax-rules (====)

[(_ program ==== value)

(let ((result (eval (quote program) (env-initial))))

(when (not (equal? program value))

(error "test failed!")))]))

(test-eval

((lambda (x) (+ 3 4)) 20)

====

7)

(test-eval

(letrec ((f (lambda (n)

(if (&lt;= n 1)

1

(* n (f (- n 1)))))))

(f 5))

====

120)

(test-eval

(let ((x 100))

(begin

(set! x 20)

x))

====

20)

(test-eval

(let ((x 1000))

(begin (let ((x 10))

20)

x))

====

1000)

;; Programs are translated into a single letrec expression.

(define (define-&gt;binding define)

(match define

[`(define (,f . ,formals) ,body)

; =&gt;

`(,f (lambda ,formals ,body))]

[`(define ,v ,value)

; =&gt;

`(,v ,value)]

[else

; =&gt;

`(,(gensym) ,define)]))

(define (transform-top-level defines)

`(letrec ,(map define-&gt;binding defines)

(void)))

(define (eval-program program)

(eval (transform-top-level program) (env-initial)))

(define (read-all)

(let ((next (read)))

(if (eof-object? next)

'()

(cons next (read-all)))))

; read in a program, and evaluate:

(eval-program (read-all))

更多信息請查看IT技術專欄

更多信息請查看技術文章
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
亚洲夜间福利| 欧美淫片网站| 亚洲小说区图片区| 香蕉久久夜色| 国产欧美一区二区三区国产幕精品| 欧美另类亚洲| 欧美 日韩 国产在线| 欧美一区二区三区久久精品茉莉花| 欧美日韩在线高清| 欧美婷婷在线| 韩国久久久久| 午夜在线精品偷拍| 免费日韩视频| 欧美88av| 国内精品视频在线播放| 亚洲高清不卡一区| 国产精品入口66mio| 91久久亚洲| 亚洲日本无吗高清不卡| 亚洲欧洲一区| 黄色日韩在线| 亚洲精品中文字幕在线| 国产情侣一区| 美女视频一区免费观看| 女人香蕉久久**毛片精品| 午夜亚洲福利| 亚洲大胆av| 亚洲专区欧美专区| 亚洲欧美伊人| 99精品国产99久久久久久福利| 亚洲人www| 亚洲综合欧美日韩| 欧美日韩喷水| 国产一区二区三区黄| 久久综合狠狠| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲高清成人| 91久久精品一区二区别| 黄色在线一区| 玖玖在线精品| 久久久久免费| 欧美日韩亚洲三区| 亚洲欧洲一区二区在线观看 | 亚洲精品乱码久久久久久蜜桃91| 亚洲久久一区二区| 久久三级福利| 99pao成人国产永久免费视频| 久久天堂成人| 亚洲黄色成人| 欧美69wwwcom| 黑丝一区二区三区| 六月丁香综合| 99精品久久久| 国产专区一区| 免播放器亚洲| 性色一区二区三区| 一本色道88久久加勒比精品| 欧美日韩精品免费观看| 亚洲在线播放| 亚洲人www| 国产精品草草| 欧美啪啪一区| 99伊人成综合| 亚洲福利专区| 亚洲天堂黄色| 欧美成人精品| 欧美黄免费看| 欧美国产三区| 欧美成人免费在线| 国产乱人伦精品一区二区 | 激情文学一区| 欧美三级不卡| 久久久亚洲一区| 免费在线一区二区| 欧美亚洲一区二区三区| 国产伦精品一区二区三区照片91| 最新日韩在线| 亚洲日本激情| 亚洲巨乳在线| 在线一区亚洲| 国产亚洲一区在线| 国产精品主播| 久久精品电影| 国产精品一区亚洲| 久久精精品视频| 久久久久久一区| 韩日精品在线| 亚洲国产婷婷| 宅男噜噜噜66国产日韩在线观看| 一区二区高清视频| 国产偷久久久精品专区| 国产精品推荐精品| 欧美资源在线| 欧美黄色一区| 欧美三级乱码| 老司机午夜精品视频在线观看| 欧美一区三区二区在线观看| 欧美成人一品| 国产一区亚洲| 亚洲久久成人| 国产农村妇女精品一区二区| 久久经典综合| 狠狠色狠狠色综合日日tαg| 亚洲国产精品一区制服丝袜 | 亚洲精选在线| 亚洲一卡久久| 欧美一区二区三区久久精品茉莉花| 午夜天堂精品久久久久| 亚洲激情专区| 香蕉久久国产| 黄色日韩在线| 久久aⅴ国产紧身牛仔裤| 欧美.www| 国产亚洲激情| 午夜精品亚洲| 欧美日韩三区| 国产精品国产亚洲精品看不卡15 | 麻豆成人在线| 香蕉久久夜色精品| 美女诱惑一区| 欧美成人久久| 国产一区二区无遮挡| 亚洲午夜一区| 一本色道久久综合亚洲精品高清| 99riav1国产精品视频| 亚洲日本成人| 国产午夜精品一区二区三区欧美| 国产精品亚洲产品| 蜜桃av一区| 欧美日韩国产精品一卡| 影音先锋中文字幕一区| 亚洲国产专区| 午夜一区不卡| 欧美日韩国内| 一本色道久久综合一区| 亚洲尤物精选| 欧美日韩一区二| 亚洲福利精品| 免费日韩精品中文字幕视频在线| 久久精品综合一区| 亚洲视频日本| 亚洲欧美日韩视频二区| 欧美福利精品| 妖精视频成人观看www| 性高湖久久久久久久久| 欧美福利精品| 日韩午夜黄色| 欧美暴力喷水在线| 国产午夜精品一区二区三区欧美| 欧美一区国产一区| 99这里有精品| 午夜天堂精品久久久久| 亚洲看片一区| 久久亚洲免费| 一区二区激情| 狠狠色综合网| 久久久精品动漫| 99精品国产高清一区二区| 欧美一区亚洲| 亚洲一区二区三区涩| 亚洲午夜精品国产| 欧美在线亚洲| 欧美一进一出视频| 野花国产精品入口| 亚洲午夜精品久久| 欧美二区在线| 久久一日本道色综合久久| 一本色道婷婷久久欧美| 狠狠色综合网| 欧美成人一区二免费视频软件| 国产三区精品| 亚洲狼人精品一区二区三区| 欧美日韩国产探花| 久久久久欧美| 久久不射网站| 亚洲综合不卡| 国产一区二区高清视频| 亚洲高清网站| 在线观看不卡| 激情一区二区三区| 亚洲一二区在线| 亚洲午夜一级| 亚洲二区免费| 亚洲激情社区| 91久久视频| 99精品久久| 一区二区三区欧美在线| 日韩午夜av在线| 亚洲精品一区二区三区蜜桃久 | 先锋影音久久| 亚洲影视综合| 美女国产精品| 欧美激情1区| 午夜国产欧美理论在线播放 | 国产精品夜夜夜一区二区三区尤| 亚洲精选在线| 99re6热在线精品视频播放速度| 亚洲国产日韩欧美| 日韩香蕉视频| 亚洲欧美不卡| 久久本道综合色狠狠五月| 免费精品视频| 午夜精品一区二区三区四区| 欧美三区美女| 影音先锋久久久| 国产欧美日韩亚洲| 亚洲欧美日本日韩| 欧美精品在线一区| 红桃视频国产精品| 亚洲片区在线| 国产农村妇女精品一区二区| 久久久噜噜噜久久狠狠50岁| 欧美久久一区| 亚洲欧洲日本一区二区三区| 国产欧美三级| 久久综合狠狠| 精品999在线观看| 国产日韩一区| 欧美在线1区| 亚洲第一网站| 亚洲尤物精选| 亚洲小说欧美另类婷婷| 国产日韩综合| 欧美一区网站| 在线视频观看日韩| 久久精品国产综合精品| 在线视频观看日韩| 久久在线精品| 亚洲日本激情| 欧美 日韩 国产一区二区在线视频 | 欧美三日本三级少妇三99| 在线播放一区| 美脚丝袜一区二区三区在线观看| 欧美日韩亚洲一区二区三区在线观看| 亚洲国产精品一区二区第四页av| 国产视频不卡| 欧美日韩亚洲三区| 亚洲欧美日韩一区在线观看| 精品电影一区| 欧美国内亚洲| 亚洲欧美日本国产专区一区| 亚洲国产激情| 老司机午夜精品视频| 亚洲日韩视频| 欧美日韩综合精品| 久久精品五月| 亚洲尤物影院| 国产一区二区三区黄| 红桃视频欧美| 欧美日韩国产探花| 久久久噜噜噜久久狠狠50岁| 宅男噜噜噜66一区二区 | 裸体素人女欧美日韩| 亚洲国产欧美日韩| 欧美日韩精品免费观看视频完整| 亚洲一区一卡| 亚洲一区二区三区涩| 一本一道久久综合狠狠老精东影业| 狠狠爱成人网| 国产精品啊啊啊| 欧美日韩国产精品一区二区亚洲| 久久久久久久尹人综合网亚洲 | 国产综合婷婷| 欧美日韩岛国| 欧美精品九九| 午夜日韩视频| 欧美片第1页综合| 欧美a级片一区| 久久精品毛片| 欧美大片专区| 欧美午夜精品久久久久免费视| 老司机午夜精品视频| 欧美二区在线| 国产精品mv在线观看| 国产精品二区二区三区| 一区在线观看| 在线综合亚洲| 久久精品成人| 欧美日韩一区二区三区在线视频| 国内一区二区在线视频观看| 永久久久久久| 国产精品乱码一区二区三区| 久久成人一区| 欧美日韩国产色综合一二三四| 欧美系列一区| 在线视频国内自拍亚洲视频| 亚洲开发第一视频在线播放| 国产精品裸体一区二区三区| 亚洲国产激情| 国内在线观看一区二区三区| 亚洲人人精品| 久久中文欧美| 国产精品日韩二区| 亚洲国产免费| 亚洲第一在线| 亚洲经典三级| 亚洲欧美日韩国产| 99精品欧美一区二区三区| 老妇喷水一区二区三区| 国产日韩专区| 最近看过的日韩成人| 亚洲一区二区三区午夜| 久久三级福利| 亚洲麻豆视频| 女人香蕉久久**毛片精品| 亚洲午夜精品久久久久久浪潮 | 欧美日韩在线一区二区三区| 亚洲激情黄色| 欧美成ee人免费视频| av不卡免费看| 国产精品v欧美精品∨日韩| 国产精品免费区二区三区观看| 欧美日韩伊人| 亚洲欧美日韩精品综合在线观看| 午夜久久99| 欧美亚洲三区| 亚洲少妇一区| 在线观看成人av电影| 久久精品天堂| 日韩视频在线播放 | 午夜精品999| 国产精品一页| 亚洲人成免费| 欧美日韩亚洲一区| 久久久久高清| 国产日韩综合| 一区二区动漫| 亚洲激情自拍| 在线欧美日韩| 伊人久久大香线蕉av超碰演员| 欧美精品七区| 欧美成人高清| 久久青青草综合| 美女久久一区| 久久久久久久久久久久久久一区| 国产精品入口66mio| 99re热精品| 亚洲精品在线视频观看| 亚洲国产一区二区三区高清| 国产精品xvideos88| 欧美欧美全黄| 欧美午夜在线| 国内精品久久久久久久果冻传媒 | 欧美在线黄色| 国产在线精品二区| 极品中文字幕一区| 亚洲私人影院| 麻豆精品视频| 国产精品久久久免费| 日韩午夜av在线| 亚洲毛片播放| 在线一区亚洲| 国产一区二区久久久| 夜夜嗨一区二区| 国产精品手机视频| 午夜在线观看免费一区| 香蕉成人久久| 久久久久se| 欧美日韩亚洲一区三区| 黄色亚洲免费| 国产欧美在线| 久久婷婷一区| 国产一区再线| 一区二区精品在线观看| 美女国产精品| 亚洲一二三区精品| 国产一区二区高清不卡| 久久一区激情| 亚洲第一在线| 亚洲免费一区二区| 欧美日本一区二区高清播放视频| 伊人精品视频| 久久久久免费| 久久精品毛片| 久久先锋影音| 国一区二区在线观看| 91久久极品少妇xxxxⅹ软件| 国产精品日韩欧美一区| 欧美日韩精品免费观看视一区二区| 亚洲高清成人| 鲁大师影院一区二区三区| 国产综合18久久久久久| 国产精品日韩精品欧美精品| 老司机免费视频久久| 亚洲精品一区二区三| 久久久噜噜噜久久狠狠50岁| 亚洲高清毛片| 欧美一区免费| 国产精品三区www17con| 欧美体内she精视频在线观看| 国产精品腿扒开做爽爽爽挤奶网站| 欧美福利一区二区三区| 国产视频不卡| 精品91在线| 欧美激情成人在线| 午夜在线精品偷拍| 一区二区av| 亚洲国产午夜| 黑丝一区二区三区| 欧美一区三区二区在线观看|