8门编程语言的设计思考

953 views

Published on

http://maskray.me/blog/2012-07-21-design-thinking-of-eight-programming-languages

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
953
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
8
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

8门编程语言的设计思考

  1. 1. 8 门编程语言的设计思考 . . 8 门编程语言的设计思考 宋方睿 http://maskray.tk emacs.ray@gmail.com 2012 年 7 月 21 日 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  2. 2. 8 门编程语言的设计思考 Outline .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  3. 3. 8 门编程语言的设计思考 声明 对大多数语言我的理解都很肤浅,甚至无法用该语言 写出一个不琐碎的程序 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  4. 4. 8 门编程语言的设计思考 声明 对大多数语言我的理解都很肤浅,甚至无法用该语言 写出一个不琐碎的程序 希望大家能了解到传统的 imperative、object-oriented 以外的东西 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  5. 5. 8 门编程语言的设计思考 声明 对大多数语言我的理解都很肤浅,甚至无法用该语言 写出一个不琐碎的程序 希望大家能了解到传统的 imperative、object-oriented 以外的东西 对编程语言有不同的认识 (如工具是要精心挑选并且 需要打磨的) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  6. 6. 8 门编程语言的设计思考 (display “hello, world”) . Example (hello, world) . (display "hello, world") . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  7. 7. 8 门编程语言的设计思考 Scheme Appeared in 1975 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  8. 8. 8 门编程语言的设计思考 Scheme Appeared in 1975 Functional .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  9. 9. 8 门编程语言的设计思考 Scheme Appeared in 1975 Functional Imperative .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  10. 10. 8 门编程语言的设计思考 理念 minimalism .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  11. 11. 8 门编程语言的设计思考 Homoiconicity (name “mad” age 60) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  12. 12. 8 门编程语言的设计思考 Homoiconicity (name “mad” age 60) ((name . “foo”) (name . “bar”) (name . “metasyntactic”)) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  13. 13. 8 门编程语言的设计思考 Homoiconicity (name “mad” age 60) ((name . “foo”) (name . “bar”) (name . “metasyntactic”)) (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  14. 14. 8 门编程语言的设计思考 Homoiconicity (name “mad” age 60) ((name . “foo”) (name . “bar”) (name . “metasyntactic”)) (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) Douglas McIlroy (1960) Macro Instruction Extensions of Compiler Languages .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  15. 15. 8 门编程语言的设计思考 Homoiconicity (name “mad” age 60) ((name . “foo”) (name . “bar”) (name . “metasyntactic”)) (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) Douglas McIlroy (1960) Macro Instruction Extensions of Compiler Languages 程序形式和数据结构一致 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  16. 16. 8 门编程语言的设计思考 Homoiconicity (name “mad” age 60) ((name . “foo”) (name . “bar”) (name . “metasyntactic”)) (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) Douglas McIlroy (1960) Macro Instruction Extensions of Compiler Languages 程序形式和数据结构一致 易于扩展 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  17. 17. 8 门编程语言的设计思考 Homoiconicity (name “mad” age 60) ((name . “foo”) (name . “bar”) (name . “metasyntactic”)) (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) Douglas McIlroy (1960) Macro Instruction Extensions of Compiler Languages 程序形式和数据结构一致 易于扩展 容易实现 meta programming .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  18. 18. 8 门编程语言的设计思考 Homoiconicity (name “mad” age 60) ((name . “foo”) (name . “bar”) (name . “metasyntactic”)) (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) Douglas McIlroy (1960) Macro Instruction Extensions of Compiler Languages 程序形式和数据结构一致 易于扩展 容易实现 meta programming tail recursion .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  19. 19. 8 门编程语言的设计思考 First-class continuation (display (call/cc (lambda (cc) (cc "escape from the point") (display "This sentence won't get displayed")))) (let ((k #f)) (call/cc (lambda (cc) (set! k cc))) (display "loopn") (k)) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  20. 20. 8 门编程语言的设计思考 First-class continuation (define cont #f) (define (f) (let ((i 0)) (call/cc (lambda (k) (set! cont k))) (set! i (1+ i)) i)) (define a (f)) (display a) (newline) (cont) (cont) (cont) (display a) (newline) Icon 的 generator .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  21. 21. 8 门编程语言的设计思考 First-class continuation (define cont #f) (define (f) (let ((i 0)) (call/cc (lambda (k) (set! cont k))) (set! i (1+ i)) i)) (define a (f)) (display a) (newline) (cont) (cont) (cont) (display a) (newline) Icon 的 generator 更熟悉的名字是 Python 里的 yield .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  22. 22. 8 门编程语言的设计思考 First-class continuation (define cont #f) (define (f) (let ((i 0)) (call/cc (lambda (k) (set! cont k))) (set! i (1+ i)) i)) (define a (f)) (display a) (newline) (cont) (cont) (cont) (display a) (newline) Icon 的 generator 更熟悉的名字是 Python 里的 yield coroutine .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  23. 23. 8 门编程语言的设计思考 First-class continuation (define cont #f) (define (f) (let ((i 0)) (call/cc (lambda (k) (set! cont k))) (set! i (1+ i)) i)) (define a (f)) (display a) (newline) (cont) (cont) (cont) (display a) (newline) Icon 的 generator 更熟悉的名字是 Python 里的 yield coroutine exception handling .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  24. 24. 8 门编程语言的设计思考 First-class continuation (define cont #f) (define (f) (let ((i 0)) (call/cc (lambda (k) (set! cont k))) (set! i (1+ i)) i)) (define a (f)) (display a) (newline) (cont) (cont) (cont) (display a) (newline) Icon 的 generator 更熟悉的名字是 Python 里的 yield coroutine exception handling delimited continuation: reset/shift .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  25. 25. 8 门编程语言的设计思考 Lazy evaluation What is lazy evaluation? (delay/force) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  26. 26. 8 门编程语言的设计思考 Lazy evaluation What is lazy evaluation? (delay/force) I’m too lazy to answer the question right now. .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  27. 27. 8 门编程语言的设计思考 Macro .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  28. 28. 8 门编程语言的设计思考 Naming convention 谓词名以? 结尾 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  29. 29. 8 门编程语言的设计思考 Naming convention 谓词名以? 结尾 eq? zero? .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  30. 30. 8 门编程语言的设计思考 Naming convention 谓词名以? 结尾 eq? zero? 类型转换函数名称中间有 -> .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  31. 31. 8 门编程语言的设计思考 Naming convention 谓词名以? 结尾 eq? zero? 类型转换函数名称中间有 -> list->vector .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  32. 32. 8 门编程语言的设计思考 Naming convention 谓词名以? 结尾 eq? zero? 类型转换函数名称中间有 -> list->vector 带副作用的函数 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  33. 33. 8 门编程语言的设计思考 Naming convention 谓词名以? 结尾 eq? zero? 类型转换函数名称中间有 -> list->vector 带副作用的函数 set! vector-set! .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  34. 34. 8 门编程语言的设计思考 40 - 32 / 2 = 4 ! . Example (Twitter) . 40 - 32 / 2 = 4 ! . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  35. 35. 8 门编程语言的设计思考 40 - 32 / 2 = 4 ! . Example (Twitter) . 40 - 32 / 2 = 4 ! 40 - (32 / 2) = 4*3*2*1 . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  36. 36. 8 门编程语言的设计思考 40 - 32 / 2 = 4 ! . Example (Twitter) . 40 - 32 / 2 = 4 ! 40 - (32 / 2) = 4*3*2*1 (((40 - 32) / 2) = 4) ! . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  37. 37. 8 门编程语言的设计思考 Smalltalk Appeared in 1972 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  38. 38. 8 门编程语言的设计思考 Smalltalk Appeared in 1972 Object-oriented . Example (hello, world) . Transcript show: 'Hello, World!' . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  39. 39. 8 门编程语言的设计思考 Smalltalk Appeared in 1972 Object-oriented Dynamically typed . Example (hello, world) . Transcript show: 'Hello, World!' . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  40. 40. 8 门编程语言的设计思考 Smalltalk Appeared in 1972 Object-oriented Dynamically typed Reflective . Example (hello, world) . Transcript show: 'Hello, World!' . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  41. 41. 8 门编程语言的设计思考 Message passing . Example (Unary messages) . 42 factorial . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  42. 42. 8 门编程语言的设计思考 Message passing . Example (Unary messages) . 42 factorial ‘meow’ size . . Example (Binary messages) . . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  43. 43. 8 门编程语言的设计思考 Message passing . Example (Unary messages) . 42 factorial ‘meow’ size . . Example (Binary messages) . 1+2 . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  44. 44. 8 门编程语言的设计思考 Message passing . Example (Unary messages) . 42 factorial ‘meow’ size . . Example (Binary messages) . 1+2 3=3 . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  45. 45. 8 门编程语言的设计思考 Message passing . Example (Keyword messages) . 每个 selector 后有个冒号 . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  46. 46. 8 门编程语言的设计思考 Message passing . Example (Keyword messages) . 每个 selector 后有个冒号 Transcript print: ‘hello, world’ . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  47. 47. 8 门编程语言的设计思考 Message passing . Example (Keyword messages) . 每个 selector 后有个冒号 Transcript print: ‘hello, world’ 0 bitAt: 3 put: 1 . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  48. 48. 8 门编程语言的设计思考 和常规方法比较 没有繁杂的优先级,只须记住 unary > binary > keyword .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  49. 49. 8 门编程语言的设计思考 和常规方法比较 没有繁杂的优先级,只须记住 unary > binary > keyword 相同类型的左结合 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  50. 50. 8 门编程语言的设计思考 和常规方法比较 没有繁杂的优先级,只须记住 unary > binary > keyword 相同类型的左结合 函数调用时参数非匿名有什么好处? .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  51. 51. 8 门编程语言的设计思考 Block . Example . [:x | x+1] . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  52. 52. 8 门编程语言的设计思考 Block . Example . [:x | x+1] anObject ifTrue: [block-expression-1. block-expression-2] . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  53. 53. 8 门编程语言的设计思考 Block . Example . [:x | x+1] anObject ifTrue: [block-expression-1. block-expression-2] anObject ifTrue: [block-expression-1. block-expression-2] ifFalse: [block-expression-3. block-expression-4] . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  54. 54. 8 门编程语言的设计思考 Block . Example . [:x | x+1] anObject ifTrue: [block-expression-1. block-expression-2] anObject ifTrue: [block-expression-1. block-expression-2] ifFalse: [block-expression-3. block-expression-4] 不是 applicative order(有些材料中这个词和 call by value 同义),所以放在 block 里可以延缓求值 . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  55. 55. 8 门编程语言的设计思考 Blocks First-class objects .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  56. 56. 8 门编程语言的设计思考 Blocks First-class objects 可以形成 closure .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  57. 57. 8 门编程语言的设计思考 Blocks First-class objects 可以形成 closure 通过 value: message 来执行 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  58. 58. 8 门编程语言的设计思考 Blocks First-class objects 可以形成 closure 通过 value: message 来执行 [3] value .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  59. 59. 8 门编程语言的设计思考 Blocks First-class objects 可以形成 closure 通过 value: message 来执行 [3] value [:x | x+1] value: 3 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  60. 60. 8 门编程语言的设计思考 Blocks First-class objects 可以形成 closure 通过 value: message 来执行 [3] value [:x | x+1] value: 3 [:x :y | x+y] value: 3 value: 3 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  61. 61. 8 门编程语言的设计思考 List comprehensions . Example (Smalltalk way) . (1 to: 10) fold: [:x :y | x * y]. . . Example (if) . anObject ifTrue: [ block1 ] ifFalse: [ block2 . ] .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  62. 62. 8 门编程语言的设计思考 影响 object-oriented programming .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  63. 63. 8 门编程语言的设计思考 影响 object-oriented programming 窗口环境的设计 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  64. 64. 8 门编程语言的设计思考 影响 object-oriented programming 窗口环境的设计 virtual machine .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  65. 65. 8 门编程语言的设计思考 影响 object-oriented programming 窗口环境的设计 virtual machine message passing 风格和 class hierarchy .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  66. 66. 8 门编程语言的设计思考 影响 object-oriented programming 窗口环境的设计 virtual machine message passing 风格和 class hierarchy integrated development environment .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  67. 67. 8 门编程语言的设计思考 影响 object-oriented programming 窗口环境的设计 virtual machine message passing 风格和 class hierarchy integrated development environment hot swapping .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  68. 68. 8 门编程语言的设计思考 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  69. 69. 8 门编程语言的设计思考 Lua Appeared in 1993 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  70. 70. 8 门编程语言的设计思考 Lua Appeared in 1993 imperative .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  71. 71. 8 门编程语言的设计思考 Lua Appeared in 1993 imperative prototype-based object-oriented .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  72. 72. 8 门编程语言的设计思考 Table Assocative array .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  73. 73. 8 门编程语言的设计思考 Table Assocative array 数组也是 table .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  74. 74. 8 门编程语言的设计思考 Table Assocative array 数组也是 table Metatable,object-oriented 的基石。Javascript 的 prototype 也是个类似的设计。 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  75. 75. 8 门编程语言的设计思考 Table Assocative array 数组也是 table Metatable,object-oriented 的基石。Javascript 的 prototype 也是个类似的设计。 require .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  76. 76. 8 门编程语言的设计思考 Object-oriented Account = {} f u n c t i o n Account : new ( ) o = { b a l a n c e = 0} setmetatable (o , s e l f ) s e l f . __index = s e l f return o end f u n c t i o n Account : d e p o s i t ( v ) s e l f . balance = s e l f . balance + v end B a n k P r e s i d e n t A c c o u n t = Account : new ( ) fu n c t i o n BankPresidentAccount : d ep o s i t ( v ) s e l f . balance = s e l f . balance + v * 2 end j o e = B a n k P r e s i d e n t A c c o u n t : new ( ) joe : deposit (17) print ( joe . balance ) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  77. 77. 8 门编程语言的设计思考 Llama, alpaca, Camel .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  78. 78. 8 门编程语言的设计思考 Perl Appeared in 1987 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  79. 79. 8 门编程语言的设计思考 Perl Appeared in 1987 Imperative .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  80. 80. 8 门编程语言的设计思考 Perl Appeared in 1987 Imperative Reflective .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  81. 81. 8 门编程语言的设计思考 Regular expression named capture .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  82. 82. 8 门编程语言的设计思考 Regular expression named capture look-around .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  83. 83. 8 门编程语言的设计思考 Regular expression named capture look-around executing code .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  84. 84. 8 门编程语言的设计思考 Regular expression named capture look-around executing code (?>pattern) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  85. 85. 8 门编程语言的设计思考 Sigil . example . my @a = qw/0 1 2 3 / ; $a [ 1 ] . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  86. 86. 8 门编程语言的设计思考 Sigil . example . sub v { $m = pop ; my @g = b%t , $ * ; $ s = @g ; $z = 0 ; map{ $x =0; map{ $ $ s [ $z ] [ $x ] = $$m [ $z ] [ $x ] eq ’#’ && $ $ s [ $z ] [ $ + ’ : ’− ’ ; $x++ } @$_ ; $z++ } @$m ; $s } . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  87. 87. 8 门编程语言的设计思考 莫名其妙的全局变量 $. ($INPUT_LINE_NUMBER) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  88. 88. 8 门编程语言的设计思考 莫名其妙的全局变量 $. ($INPUT_LINE_NUMBER) $, ($OUTPUT_FIELD_SEPARATOR) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  89. 89. 8 门编程语言的设计思考 莫名其妙的全局变量 $. ($INPUT_LINE_NUMBER) $, ($OUTPUT_FIELD_SEPARATOR) $/ ($INPUT_RECORD_SEPARATOR) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  90. 90. 8 门编程语言的设计思考 莫名其妙的全局变量 $. ($INPUT_LINE_NUMBER) $, ($OUTPUT_FIELD_SEPARATOR) $/ ($INPUT_RECORD_SEPARATOR) perldoc perlvar .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  91. 91. 8 门编程语言的设计思考 难以创造稍微复杂一点的数据结构 二维数组? $a = [ [ 1 ] , [ 2 ] ] ; p r i n t $a − > [ 1 ] [ 0 ] ; .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  92. 92. 8 门编程语言的设计思考 难以创造稍微复杂一点的数据结构 二维数组? $a = [ [ 1 ] , [ 2 ] ] ; p r i n t $a − > [ 1 ] [ 0 ] ; .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  93. 93. 8 门编程语言的设计思考 难以创造稍微复杂一点的数据结构 二维数组? $a = [ [ 1 ] , [ 2 ] ] ; p r i n t $a − > [ 1 ] [ 0 ] ; perldoc perllol .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  94. 94. 8 门编程语言的设计思考 Increment Operator $a =3; $a++; p r i n t $a ; $a= ’ ab ’ ; $a++; p r i n t $a ; .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  95. 95. 8 门编程语言的设计思考 Increment Operator $a =3; $a++; p r i n t $a ; $a= ’ ab ’ ; $a++; p r i n t $a ; .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  96. 96. 8 门编程语言的设计思考 Object-oriented package P e r s o n ; sub new { my $ c l a s s = s h i f t ; my $ s e l f = { _ f i r s t N a m e => s h i f t , _lastName bless $self , $class ; $self ; } => s h i f t package Employee ; use P e r s o n ; o u r @ISA = qw( P e r s o n ) ; .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  97. 97. 8 门编程语言的设计思考 Overloading void/scalar/list context .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  98. 98. 8 门编程语言的设计思考 Overloading void/scalar/list context 滥用 Zero one infinity rule .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  99. 99. 8 门编程语言的设计思考 Overloading void/scalar/list context 滥用 Zero one infinity rule 重载过头了,比如 perldoc -f open 给的 open 的用 法 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  100. 100. 8 门编程语言的设计思考 Overloading void/scalar/list context 滥用 Zero one infinity rule 重载过头了,比如 perldoc -f open 给的 open 的用 法 为了不是非常常见的情况下的便利牺牲了可读性,增 加了复杂性 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  101. 101. 8 门编程语言的设计思考 Overloading void/scalar/list context 滥用 Zero one infinity rule 重载过头了,比如 perldoc -f open 给的 open 的用 法 为了不是非常常见的情况下的便利牺牲了可读性,增 加了复杂性 表现力其实非常差,增加的表现力都是通过繁杂零碎 的细节规则实现的,而非通用的。和 Scheme/Smalltalk 相比无疑是个弱者 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  102. 102. 8 门编程语言的设计思考 Ruby Appeared in 1995 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  103. 103. 8 门编程语言的设计思考 Ruby Appeared in 1995 Reflective .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  104. 104. 8 门编程语言的设计思考 Ruby Appeared in 1995 Reflective Dynamic typing .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  105. 105. 8 门编程语言的设计思考 Ruby Appeared in 1995 Reflective Dynamic typing Object-oriented .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  106. 106. 8 门编程语言的设计思考 高度 object-oriented 3.to_s .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  107. 107. 8 门编程语言的设计思考 高度 object-oriented 3.to_s 4.class .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  108. 108. 8 门编程语言的设计思考 高度 object-oriented 3.to_s 4.class 5.methods .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  109. 109. 8 门编程语言的设计思考 高度 object-oriented 3.to_s 4.class 5.methods 6.send :to_f, Smalltalk 的 message-passing 风格 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  110. 110. 8 门编程语言的设计思考 理念 Mixin。消除了不少 marker interface 的问题 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  111. 111. 8 门编程语言的设计思考 理念 Mixin。消除了不少 marker interface 的问题 对 functional 友好 (听说 Python 的 BDFL 不遗余力地 想排除 map filter 这些函数,他本人学习 Haskell 的一 些吐槽也被 reddit 上的人吐槽……打住,再下去就 flame war 了) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  112. 112. 8 门编程语言的设计思考 理念 Mixin。消除了不少 marker interface 的问题 对 functional 友好 (听说 Python 的 BDFL 不遗余力地 想排除 map filter 这些函数,他本人学习 Haskell 的一 些吐槽也被 reddit 上的人吐槽……打住,再下去就 flame war 了) sort! nil? 来自 Scheme .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  113. 113. 8 门编程语言的设计思考 理念 Mixin。消除了不少 marker interface 的问题 对 functional 友好 (听说 Python 的 BDFL 不遗余力地 想排除 map filter 这些函数,他本人学习 Haskell 的一 些吐槽也被 reddit 上的人吐槽……打住,再下去就 flame war 了) sort! nil? 来自 Scheme @instance_var sigil,来自 Perl,但含义发生变化,还 有 $global 表示 global variable .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  114. 114. 8 门编程语言的设计思考 理念 Mixin。消除了不少 marker interface 的问题 对 functional 友好 (听说 Python 的 BDFL 不遗余力地 想排除 map filter 这些函数,他本人学习 Haskell 的一 些吐槽也被 reddit 上的人吐槽……打住,再下去就 flame war 了) sort! nil? 来自 Scheme @instance_var sigil,来自 Perl,但含义发生变化,还 有 $global 表示 global variable 只有 nil 和 false 为假,[] "" {} 等是真,更安全,nil 是 dynamic typing 和 reflective 的一个妥协 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  115. 115. 8 门编程语言的设计思考 理念 First-class continuation 来自 Scheme .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  116. 116. 8 门编程语言的设计思考 理念 First-class continuation 来自 Scheme Operator overloading 的方式 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  117. 117. 8 门编程语言的设计思考 理念 First-class continuation 来自 Scheme Operator overloading 的方式 Smalltalk 的 block,Ruby 用 do end 语法只支持一个 block(实际上这样够用了) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  118. 118. 8 门编程语言的设计思考 理念 First-class continuation 来自 Scheme Operator overloading 的方式 Smalltalk 的 block,Ruby 用 do end 语法只支持一个 block(实际上这样够用了) 易于实现 embedded domain specific language .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  119. 119. 8 门编程语言的设计思考 Ruby 1.9 hash syntax 是不是类似 Smalltalk 的 keyword message def f ( * a r g s ) p args end f 3 , ’ a ’ , one : 5 , two : 8 => [3, "a", {:one=>5, :two=>8}] .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  120. 120. 8 门编程语言的设计思考 Ruby 1.9 hash syntax 是不是类似 Smalltalk 的 keyword message def f ( * a r g s ) p args end f 3 , ’ a ’ , one : 5 , two : 8 => [3, "a", {:one=>5, :two=>8}] {:arr => [1,2], :str => ‘hello’} .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  121. 121. 8 门编程语言的设计思考 Block 是不是 Python with statement 的通用版 def f u n &b l o c k # acquire resource b l o c k . c a l l 42 # release resource end f u n do p ’ hello ’ end .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  122. 122. 8 门编程语言的设计思考 Block 是不是 Python with statement 的通用版 def f u n &b l o c k # acquire resource b l o c k . c a l l 42 # release resource end f u n do p ’ hello ’ end .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  123. 123. 8 门编程语言的设计思考 Block (1..5).inject(1) {|acc,x| acc*x } .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  124. 124. 8 门编程语言的设计思考 Prolog Appeared in 1972 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  125. 125. 8 门编程语言的设计思考 Prolog Appeared in 1972 Logic .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  126. 126. 8 门编程语言的设计思考 模型 事实 f (a , c ). f (b , c ) . ?− f (X , b ) . X = a ; X = c. .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  127. 127. 8 门编程语言的设计思考 模型 事实 规则 f (a , c ). f (b , c ) . ?− f (X , b ) . X = a ; X = c. .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  128. 128. 8 门编程语言的设计思考 模型 事实 规则 查询 f (a , c ). f (b , c ) . ?− f (X , b ) . X = a ; X = c. .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  129. 129. 8 门编程语言的设计思考 Operator 一些方言中允许自定义,还能指定优先级和结合性 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  130. 130. 8 门编程语言的设计思考 Data type 大量使用 compound term 表示自定义数据类型 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  131. 131. 8 门编程语言的设计思考 Data type 大量使用 compound term 表示自定义数据类型 truck_year('Mazda', 1986) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  132. 132. 8 门编程语言的设计思考 Data type 大量使用 compound term 表示自定义数据类型 truck_year('Mazda', 1986) 用 pattern matching 来提取字段 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  133. 133. 8 门编程语言的设计思考 Predicate SLD resolution .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  134. 134. 8 门编程语言的设计思考 Predicate SLD resolution 相当于语言内置的 backtracking 机制 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  135. 135. 8 门编程语言的设计思考 Predicate SLD resolution 相当于语言内置的 backtracking 机制 会尝试返回所有结果,除非使用了 cut 来剪枝 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  136. 136. 8 门编程语言的设计思考 Definite clause grammar 像 Prolog 这么简单 (语法) 的语言也引入特殊语法 . Example (normal) . sentence(S1,S3) :- noun_phrase(S1,S2), verb_phrase(S2,S3). noun_phrase(S1,S3) :- det(S1,S2), noun(S2,S3). verb_phrase(S1,S3) :- verb(S1,S2), noun_phrase(S2,S3). det([the|X], X). det([a|X], X). noun([cat|X], X). noun([bat|X], X). verb([eats|X], X). . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  137. 137. 8 门编程语言的设计思考 Definite clause grammar . Example (DCG) . sentence --> noun_phrase, verb_phrase. noun_phrase --> det, noun. verb_phrase --> verb, noun_phrase. det --> [the]. det --> [a]. noun --> [cat]. noun --> [bat]. verb --> [eats]. . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  138. 138. 8 门编程语言的设计思考 Unification append([ ], L, L). append([X | L1], L2, [X | L3]) :- append(L1, L2, L3). .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  139. 139. 8 门编程语言的设计思考 Unification append([ ], L, L). append([X | L1], L2, [X | L3]) :- append(L1, L2, L3). ?- append([1,2],[3],X). .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  140. 140. 8 门编程语言的设计思考 Unification append([ ], L, L). append([X | L1], L2, [X | L3]) :- append(L1, L2, L3). ?- append([1,2],[3],X). ?- append([1,2],[3],[1,2,3]. .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  141. 141. 8 门编程语言的设计思考 Unification append([ ], L, L). append([X | L1], L2, [X | L3]) :- append(L1, L2, L3). ?- append([1,2],[3],X). ?- append([1,2],[3],[1,2,3]. ?- append([1,2],X,[1,2,3]). .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  142. 142. 8 门编程语言的设计思考 Unification append([ ], L, L). append([X | L1], L2, [X | L3]) :- append(L1, L2, L3). ????- append([1,2],[3],X). append([1,2],[3],[1,2,3]. append([1,2],X,[1,2,3]). append(X,Y,[1,2,3]). .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  143. 143. 8 门编程语言的设计思考 Quick sort qsort([]) -> []; qsort([P|XS]) -> qsort([X || X <- XS, X < P]) ++ [P] ++ qsort([X || X <- XS, X >= P]). .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  144. 144. 8 门编程语言的设计思考 Erlang Appeared in 1986 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  145. 145. 8 门编程语言的设计思考 Erlang Appeared in 1986 functional .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  146. 146. 8 门编程语言的设计思考 Erlang Appeared in 1986 functional dynamic typing .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  147. 147. 8 门编程语言的设计思考 Data type 非常少,基本都用 tuple 表示 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  148. 148. 8 门编程语言的设计思考 Data type 非常少,基本都用 tuple 表示 Lua 基本都用 table 表示 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  149. 149. 8 门编程语言的设计思考 Data type 非常少,基本都用 tuple 表示 Lua 基本都用 table 表示 Lisp 基本都用 list 表示 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  150. 150. 8 门编程语言的设计思考 Data type 非常少,基本都用 tuple 表示 Lua 基本都用 table 表示 Lisp 基本都用 list 表示 注意 list/tuple 看上去表现力是比 table/hash 弱的 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  151. 151. 8 门编程语言的设计思考 Data type 非常少,基本都用 tuple 表示 Lua 基本都用 table 表示 Lisp 基本都用 list 表示 注意 list/tuple 看上去表现力是比 table/hash 弱的 所以采用 Lisp 的 property list 形式 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  152. 152. 8 门编程语言的设计思考 Data type 非常少,基本都用 tuple 表示 Lua 基本都用 table 表示 Lisp 基本都用 list 表示 注意 list/tuple 看上去表现力是比 table/hash 弱的 所以采用 Lisp 的 property list 形式 小写字母打头的标识符是 atom,结合 tuple 能起到类 似 property list 的功效 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  153. 153. 8 门编程语言的设计思考 Data type 非常少,基本都用 tuple 表示 Lua 基本都用 table 表示 Lisp 基本都用 list 表示 注意 list/tuple 看上去表现力是比 table/hash 弱的 所以采用 Lisp 的 property list 形式 小写字母打头的标识符是 atom,结合 tuple 能起到类 似 property list 的功效 {hello, {x, Data}} {add,3,4} .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  154. 154. 8 门编程语言的设计思考 Concurrency 语言内置 process,Erlang VM 实现的可以看做是 green process .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  155. 155. 8 门编程语言的设计思考 Concurrency 语言内置 process,Erlang VM 实现的可以看做是 green process 和 green thread 的差异在于 process 间没有共享的状态 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  156. 156. 8 门编程语言的设计思考 Concurrency 语言内置 process,Erlang VM 实现的可以看做是 green process 和 green thread 的差异在于 process 间没有共享的状态 Actor model,避免 lock .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  157. 157. 8 门编程语言的设计思考 OCaml Appeared in 1983 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  158. 158. 8 门编程语言的设计思考 OCaml Appeared in 1983 Strong static typing .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  159. 159. 8 门编程语言的设计思考 OCaml Appeared in 1983 Strong static typing Functional .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  160. 160. 8 门编程语言的设计思考 OCaml Appeared in 1983 Strong static typing Functional Imperative .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  161. 161. 8 门编程语言的设计思考 OCaml Appeared in 1983 Strong static typing Functional Imperative object-oriented .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  162. 162. 8 门编程语言的设计思考 Function call juxtaposition print_endline "hello, world" .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  163. 163. 8 门编程语言的设计思考 结合 functional 和 object-oriented Expression problem .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  164. 164. 8 门编程语言的设计思考 结合 functional 和 object-oriented Expression problem Algebraic data type 与 class-based object-oriented 采取 的方式正交 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  165. 165. 8 门编程语言的设计思考 结合 functional 和 object-oriented Expression problem Algebraic data type 与 class-based object-oriented 采取 的方式正交 给你自由选择更合适的方式 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  166. 166. 8 门编程语言的设计思考 Currying # let add x y = x + y;; val add : int -> int -> int = <fun> # add 3;; - : int -> int = <fun> Ruby/CoffeeScript 也用了 juxtaposition,但是若支持 currying,由于 dynamic typing,容易产生 bug .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  167. 167. 8 门编程语言的设计思考 Module system 把相互关联的函数组织在一起 (如定义了一个数据类 型以及操作这个数据类型的一系列函数) module S t a c k = s t r u c t exception Stack_is_empty type ’ a s t a c k = Empty | Elem o f ’ a * ’ a s t a c k l e t push s e = Elem ( e , s ) l e t pop = f u n c t i o n | Empty −> r a i s e S t a c k _ i s _ e m p t y | Elem (_ , s ) −> s l e t top = function | Empty −> r a i s e S t a c k _ i s _ e m p t y | Elem ( e , _) −> e end .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  168. 168. 8 门编程语言的设计思考 Module system 把相互关联的函数组织在一起 (如定义了一个数据类 型以及操作这个数据类型的一系列函数) separate compilation module S t a c k = s t r u c t exception Stack_is_empty type ’ a s t a c k = Empty | Elem o f ’ a * ’ a s t a c k l e t push s e = Elem ( e , s ) l e t pop = f u n c t i o n | Empty −> r a i s e S t a c k _ i s _ e m p t y | Elem (_ , s ) −> s l e t top = function | Empty −> r a i s e S t a c k _ i s _ e m p t y | Elem ( e , _) −> e end .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  169. 169. 8 门编程语言的设计思考 Functor module type Eq = s i g type t v a l eq : t −> t −> b o o l end module MakeSet ( E : Eq ) = s t r u c t type t = E . t l e t empty = [ ] l e t add x s = x : : s l e t f i n d x s = L i s t . f i n d ( E . eq x ) s end module S t r E q = s t r u c t type t = s t r i n g l e t eq s 1 s 2 = s 1 = s 2 ; end module S t r S e t = MakeSet ( S t r E q ) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  170. 170. 8 门编程语言的设计思考 Encapsulation # let o = object v a l xs = ” ray ” method o u t p u t = p r i n t _ e n d l i n e x s end ; ; v a l o : < o u t p u t : u n i t > = <o b j > .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  171. 171. 8 门编程语言的设计思考 Row polymorphism # fun x −> x#o u t p u t ; ; − : < o u t p u t : ’ a ; . . > −> ’ a = <fun> .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  172. 172. 8 门编程语言的设计思考 Private method single coersion l e t f = fun x −> x#o u t p u t ; ; end type ’ a y = <o u t p u t : ’ a ; i n p u t : ’ a −> u n i t > −> ’ a f :> ’ a y .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  173. 173. 8 门编程语言的设计思考 Structural typing 两个类型,如果暴露给外界的接口 (public) 完全一致, 那么这两个类型就认为是相同的 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  174. 174. 8 门编程语言的设计思考 Structural typing 两个类型,如果暴露给外界的接口 (public) 完全一致, 那么这两个类型就认为是相同的 A 的接口是 B 的超集,那么 A 就是 B 的子类 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  175. 175. 8 门编程语言的设计思考 Structural typing 两个类型,如果暴露给外界的接口 (public) 完全一致, 那么这两个类型就认为是相同的 A 的接口是 B 的超集,那么 A 就是 B 的子类 C++/Java 这类语言不得不用到很多 marker interface, 而且因为 static typing,还没法动态生成类型 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  176. 176. 8 门编程语言的设计思考 Quote ** J. Maurice Rojas Once you decide strongly to stick with Haskell, it will take no longer than seven lives to attain the mastery. .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  177. 177. 8 门编程语言的设计思考 Haskell Appeared in 1990 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  178. 178. 8 门编程语言的设计思考 Haskell Appeared in 1990 Purely functional .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  179. 179. 8 门编程语言的设计思考 Haskell Appeared in 1990 Purely functional Strong static typing .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  180. 180. 8 门编程语言的设计思考 Haskell Appeared in 1990 Purely functional Strong static typing Lazy .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  181. 181. 8 门编程语言的设计思考 All positive rationals take 8 $ fix ((1:).(>>= x->[1+x,1/(1+x)])) [1.0,2.0,0.5,3.0,0.3333333333333333,1.5,0.6666666666666 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  182. 182. 8 门编程语言的设计思考 Powerset filterM (const [True, False]) [1..3] [[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]] .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  183. 183. 8 门编程语言的设计思考 Typeclass 实现 ad-hoc polymorphism 的一种方式 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  184. 184. 8 门编程语言的设计思考 Typeclass 实现 ad-hoc polymorphism 的一种方式 Int 可以做除法,Double 可以做除法,Rational 可以做 除法。需要有个 typeclass 定义哪些类型能做除法。 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  185. 185. 8 门编程语言的设计思考 Typeclass 实现 ad-hoc polymorphism 的一种方式 Int 可以做除法,Double 可以做除法,Rational 可以做 除法。需要有个 typeclass 定义哪些类型能做除法。 单参数的 typeclass 类似 C++ 的 virtual class 或者 Java 的 interface .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  186. 186. 8 门编程语言的设计思考 Typeclass 实现 ad-hoc polymorphism 的一种方式 Int 可以做除法,Double 可以做除法,Rational 可以做 除法。需要有个 typeclass 定义哪些类型能做除法。 单参数的 typeclass 类似 C++ 的 virtual class 或者 Java 的 interface 多参数、带 context、functional dependency 的情况下就 需要动用 traits template 和 SFINAE principle 了 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  187. 187. 8 门编程语言的设计思考 Typeclass 实现 ad-hoc polymorphism 的一种方式 Int 可以做除法,Double 可以做除法,Rational 可以做 除法。需要有个 typeclass 定义哪些类型能做除法。 单参数的 typeclass 类似 C++ 的 virtual class 或者 Java 的 interface 多参数、带 context、functional dependency 的情况下就 需要动用 traits template 和 SFINAE principle 了 C++ template 中的 partial specialization 在 typeclass 中 没有直接对应物 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  188. 188. 8 门编程语言的设计思考 Typeclass 实现 ad-hoc polymorphism 的一种方式 Int 可以做除法,Double 可以做除法,Rational 可以做 除法。需要有个 typeclass 定义哪些类型能做除法。 单参数的 typeclass 类似 C++ 的 virtual class 或者 Java 的 interface 多参数、带 context、functional dependency 的情况下就 需要动用 traits template 和 SFINAE principle 了 C++ template 中的 partial specialization 在 typeclass 中 没有直接对应物 没有一般化的 overlapping instance 扩展,但可用 newtype 引入新类型,或者用 context 结合 functional dependency 解决 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  189. 189. 8 门编程语言的设计思考 Typeclass 实现 ad-hoc polymorphism 的一种方式 Int 可以做除法,Double 可以做除法,Rational 可以做 除法。需要有个 typeclass 定义哪些类型能做除法。 单参数的 typeclass 类似 C++ 的 virtual class 或者 Java 的 interface 多参数、带 context、functional dependency 的情况下就 需要动用 traits template 和 SFINAE principle 了 C++ template 中的 partial specialization 在 typeclass 中 没有直接对应物 没有一般化的 overlapping instance 扩展,但可用 newtype 引入新类型,或者用 context 结合 functional dependency 解决 C++ template 不支持 paramorphic recursion(递归时参 数类型变化) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  190. 190. 8 门编程语言的设计思考 Typeclass 实现 ad-hoc polymorphism 的一种方式 Int 可以做除法,Double 可以做除法,Rational 可以做 除法。需要有个 typeclass 定义哪些类型能做除法。 单参数的 typeclass 类似 C++ 的 virtual class 或者 Java 的 interface 多参数、带 context、functional dependency 的情况下就 需要动用 traits template 和 SFINAE principle 了 C++ template 中的 partial specialization 在 typeclass 中 没有直接对应物 没有一般化的 overlapping instance 扩展,但可用 newtype 引入新类型,或者用 context 结合 functional dependency 解决 C++ template 不支持 paramorphic recursion(递归时参 数类型变化) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  191. 191. 8 门编程语言的设计思考 Num [a] . Example (Example) . i n s t a n c e Num a = Num [ a ] where > ( f : f s ) + ( g : g s ) = f+g : f s+g s fs + [] = fs [ ] + gs = gs ( f : f s ) * ( g : g s ) = f *g : [ f ] * g s + f s * ( g : g s ) _ * _ = [] [ 1 , 1 ] ^ 4 == [ 1 , 4 , 6 , 4 , 1 ] . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  192. 192. 8 门编程语言的设计思考 Re-invent imperative programming do x <− g e t ; p u t 5 ; y <− g e t ; p u t 6 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  193. 193. 8 门编程语言的设计思考 Parsec 解析一个 csv 文件 . Example (csv) . csv : : CharParser st [ [ String ] ] c s v = ( r e c o r d ‘ sepEndBy ‘ n e w l i n e ) <* e o f where r e c o r d = ( q u o t e d <|> many ( noneOf ” , ” n ” ) ) ‘ sepBy ‘ q u o t e d = between ( c h a r ’ ” ’ ) ␣ ( c h a r ␣ ’ ” ’ ) . many $ none − 可以自定义操作符,甚至优先级 . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  194. 194. 8 门编程语言的设计思考 Pattern matching . Example (Pattern guards) . add x y | 3 <− x = x + y . . Example (View patterns) . m y s o r t ( s o r t −> x s ) = x s . .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  195. 195. 8 门编程语言的设计思考 Off-side rule 源自 ISWIN .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  196. 196. 8 门编程语言的设计思考 Off-side rule 源自 ISWIN 使代码更清晰 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  197. 197. 8 门编程语言的设计思考 Number literal 1 是否应该作为 Int 类型? .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  198. 198. 8 门编程语言的设计思考 Number literal 1 是否应该作为 Int 类型? 应该是 Num 这个 Typeclass 的任意一个 instance .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  199. 199. 8 门编程语言的设计思考 String literal “asdf” 可以是 IsString 这个 Typeclass 的任意一个 instance。 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  200. 200. 8 门编程语言的设计思考 String literal “asdf” 可以是 IsString 这个 Typeclass 的任意一个 instance。 可以是 [Char],可以是 ByteString,可以是你的自定义 类型,只要提供了 IsString 的 instance .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  201. 201. 8 门编程语言的设计思考 List comprehension List comprehension 的语法非常漂亮,是否应该有 set/dictionary comprehension? .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  202. 202. 8 门编程语言的设计思考 List comprehension List comprehension 的语法非常漂亮,是否应该有 set/dictionary comprehension? 有 Monad comprehension 就够了 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  203. 203. 8 门编程语言的设计思考 Section 二元操作符也应该拥有 currying 的能力 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  204. 204. 8 门编程语言的设计思考 Section 二元操作符也应该拥有 currying 的能力 Left section, (12+), 相当于 (+) 12 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  205. 205. 8 门编程语言的设计思考 Section 二元操作符也应该拥有 currying 的能力 Left section, (12+), 相当于 (+) 12 Right section, (*13), 相当于 flip (*) 13 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  206. 206. 8 门编程语言的设计思考 Section 二元操作符也应该拥有 currying 的能力 Left section, (12+), 相当于 (+) 12 Right section, (*13), 相当于 flip (*) 13 (3 `elem`), 把正常函数变成 operator 再做 section .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  207. 207. 8 门编程语言的设计思考 Monad 传统:一个函数接受参数 a 返回 b .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  208. 208. 8 门编程语言的设计思考 Monad 传统:一个函数接受参数 a 返回 b 上述操作可以看做一个 action(原用于 IO) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  209. 209. 8 门编程语言的设计思考 Monad 传统:一个函数接受参数 a 返回 b 上述操作可以看做一个 action(原用于 IO) Monad 很通用,值得拥有一个单独的语法 do(Python 的 with statement 是否通用到值得为它赋予新语法? 疑 似源自 Lisp 的 unwind-protect) .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  210. 210. 8 门编程语言的设计思考 Monad 传统:一个函数接受参数 a 返回 b 上述操作可以看做一个 action(原用于 IO) Monad 很通用,值得拥有一个单独的语法 do(Python 的 with statement 是否通用到值得为它赋予新语法? 疑 似源自 Lisp 的 unwind-protect) Arrow 比 Monad 更抽象,也值得拥有类似的语法 proc .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  211. 211. 8 门编程语言的设计思考 Monad 传统:一个函数接受参数 a 返回 b 上述操作可以看做一个 action(原用于 IO) Monad 很通用,值得拥有一个单独的语法 do(Python 的 with statement 是否通用到值得为它赋予新语法? 疑 似源自 Lisp 的 unwind-protect) Arrow 比 Monad 更抽象,也值得拥有类似的语法 proc 可以看做 structured output .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  212. 212. 8 门编程语言的设计思考 Monad 传统:一个函数接受参数 a 返回 b 上述操作可以看做一个 action(原用于 IO) Monad 很通用,值得拥有一个单独的语法 do(Python 的 with statement 是否通用到值得为它赋予新语法? 疑 似源自 Lisp 的 unwind-protect) Arrow 比 Monad 更抽象,也值得拥有类似的语法 proc 可以看做 structured output 可以看做附带了一个环境 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  213. 213. 8 门编程语言的设计思考 Failure 不要吐槽这段代码不 idiomatic,照顾不用 Ruby 的同学 def f o o return return return return end ’ Meowth ’ u n l e s s f 36 ’ Persian ’ unless g 1 ’ f q j ’ u n l e s s h 22 17 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  214. 214. 8 门编程语言的设计思考 Error monad f o o = do f 36 g 1 h 22 r e t u r n 17 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  215. 215. 8 门编程语言的设计思考 Non-determinism def b a r [ 1 , 2 , 3 ] . map { | x | [ 4 , 5 , 6 ] . map { | y | x*y } } end .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  216. 216. 8 门编程语言的设计思考 List monad baz = do x <− [ 1 , 2 , 3 ] y <− [ 4 , 5 , 6 ] return $ x*y baz = [ x * y | x <− [ 1 , 2 , 3 ] , y <− [ 4 , 5 , 6 ] ] baz = ( * ) <$> [ 1 , 2 , 3 ] <*> [ 4 , 5 , 6 ] .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  217. 217. 8 门编程语言的设计思考 Environment def def def def f (x ); g(x ); h(x ); i (x ); g ( x ) ; i ( x ) ; end h ( x ) ; end x * x ; end x +3; end .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  218. 218. 8 门编程语言的设计思考 Reader monad f g h i = = = = g >> i h j o i n ( * ) <$> a s k (+3) <$> a s k .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  219. 219. 8 门编程语言的设计思考 Monad transformer 每一个 monad 都代表一种特殊的效果。能不能把它们 堆砌起来?于是就有了 monad transformer .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  220. 220. 8 门编程语言的设计思考 Monad transformer 每一个 monad 都代表一种特殊的效果。能不能把它们 堆砌起来?于是就有了 monad transformer 比如 xmonad 中的 layout transformer,REFLECTX TABBED MIRROR NOBORDERS .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  221. 221. 8 门编程语言的设计思考 Meta programming Lisp 的 macro 类型不够安全,需要类型安全的 Template Haskell .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  222. 222. 8 门编程语言的设计思考 Fold 什么样的东西能 fold?List?Tree?Foldable!被 fold 的 元素有什么特征?Monoid! .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  223. 223. 8 门编程语言的设计思考 Fold 什么样的东西能 fold?List?Tree?Foldable!被 fold 的 元素有什么特征?Monoid! Catamorphism .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  224. 224. 8 门编程语言的设计思考 Fold 什么样的东西能 fold?List?Tree?Foldable!被 fold 的 元素有什么特征?Monoid! Catamorphism Ruby 解决这个问题的方式是 duck typing .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  225. 225. 8 门编程语言的设计思考 Fold 什么样的东西能 fold?List?Tree?Foldable!被 fold 的 元素有什么特征?Monoid! Catamorphism Ruby 解决这个问题的方式是 duck typing “When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  226. 226. 8 门编程语言的设计思考 Fold 什么样的东西能 fold?List?Tree?Foldable!被 fold 的 元素有什么特征?Monoid! Catamorphism Ruby 解决这个问题的方式是 duck typing “When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” Common Lisp 解决这个问题的方式是让 map delete-if 这样的函数接受一个参数代表类型,有点丑陋 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  227. 227. 8 门编程语言的设计思考 Getter/setter Haskell 的 record syntax 的设计不够好 test :: [Int] test = (addOne `to` everyOther) `from` [1, 2, 9, 6, 7, 8, 4 -- test == [2, 2, 10, 6, 8, 8, 5] .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  228. 228. 8 门编程语言的设计思考 Getter/setter Haskell 的 record syntax 的设计不够好 Lens (functional reference) test :: [Int] test = (addOne `to` everyOther) `from` [1, 2, 9, 6, 7, 8, 4 -- test == [2, 2, 10, 6, 8, 8, 5] .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  229. 229. 8 门编程语言的设计思考 Lazy evaluation 消除了不必要的计算,比如和实现方式和传统毫无差 异的 merge sort,如果你用它来取列表 head,那么时 间复杂度是 O(n) 的 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  230. 230. 8 门编程语言的设计思考 Lazy evaluation 消除了不必要的计算,比如和实现方式和传统毫无差 异的 merge sort,如果你用它来取列表 head,那么时 间复杂度是 O(n) 的 可以处理无限长的列表 .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
  231. 231. 8 门编程语言的设计思考 Lazy evaluation 消除了不必要的计算,比如和实现方式和传统毫无差 异的 merge sort,如果你用它来取列表 head,那么时 间复杂度是 O(n) 的 可以处理无限长的列表 一边算一边用,比如 fibs = 0:scanl (+) 1 fibs .. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .

×