Introduction to lisp lisp.

Slides:



Advertisements
Similar presentations
勞動檢查常見違法案例說明 臺中市政府勞工局.
Advertisements

第 4 章 PHP 基本語法.
藥物濫用 華德學校上午校 黃秀雯.
党的十八届四中全会 依法治国精神解读. 党的十八届四中全会 依法治国精神解读 一、十八届四中全会概况 中国共产党第十八届中央委员会第四次全体会议,于2014年10月20日至23日在北京举行。 全会审议通过了《中共中央关于全面推进依法治国若干重大问题的决定》。
证券市场法律制度与监督管理 作者:张学亮.
毛峰教授 北京师范大学教授,博士生导师 国家社科基金项目专家 北京华文教育顾问
我怀念的乡村记忆 陈秀华 社会工作0841.
性理釋疑(1—30題) 後學 阮章輝 學講.
沟通技巧 主讲:涂育俊.
Word高级应用——制作毕业论文 Word高级应用——制作毕业论文 6..
Loops.
基于Hadoop的Map/Reduce框架研究报告
量子與能源 石化能源危機 核分裂能 核融合能 太陽能 燃料電池.
自 然 探 索 圓周美語 My name is.
組別:第四組 組員: 吳莉寧 林瑩姿 林燁芳 林佩君 指導老師:林美蓉 老師
第三章 鏈結串列 Linked List.
编译原理上机实习
ES6简介.
幼兒美勞試教 我想飛~~~~~ 四幼二A D 莊小萱 D 林昀儒 D 劉思妤
新世代計算機概論 第14章 程式語言.
手外伤与断指再植 上海第二医科大学 附属第九人民医院骨科.
Introduction to MapReduce
2017 IOS系列商务报告通用模版.
Ch07 PHP程式基礎 網頁程式設計.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
7 Intermediate Representation
API设计实例分析 通用IO API.
課程名稱:程式設計 授課老師:________
Visual Basic 6.0 學習範本 第三章 基本資料型態.
第二章 C# 基础知识.
陳維魁 博士 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 儒林圖書公司.
《大数据技术原理与应用》 第七章 MapReduce (2016春季学期) 林子雨 厦门大学计算机科学系 主页:
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
Ch13 集合與泛型 物件導向程式設計(2).
Last Lecture Revisited
厦门大学数据库实验室 MapReduce 连接
JAVA程序设计 第5章 深入理解JAVA语言----补充.
Spring & mongodb java实战mongodb 曹巍 2013年9月22日.
陳維魁 博士 儒林圖書公司 第十一章 LISP 程式語言 陳維魁 博士 儒林圖書公司.
第2次课 上下文无关文法
Homework 1(上交时间:10月14号) 倒排索引.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
集合框架和泛型(一).
第1章 C++程序设计基础 网络游戏开发-C++程序设计.
第六章 安全衛生工作守則 6-1 前 言  6-2 訂定依據相關法令規定  6-3 工作守則製作程序及製作前應注意事項  6-4 如何訂定適合需要之安全衛生工作守則  6-5 結 論.
樹 2 Michael Tsai 2013/3/26.
Programming Languages
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
软件测试 (四)静态测试与动态测试.
第5章 函数式程序设计语言 过程式程序设计语言由于数据的名值分离, 变量的时空特性导致程序难于查错、难于修改
在Microsoft Access 下 建立資料庫
Chapter 2 基本語法.
2016 IOS系列商务报告通用模版.
陳維魁 博士 儒林圖書公司 第三章 變數與繫結 陳維魁 博士 儒林圖書公司.
OpenMP程序设计 2019/4/25.
北投溫泉博物館 建築特色 ★小組成員:高103林孟璇、林念儀、施妤柔★.
計算機概論 跨越講義 第4章 基本視窗程式應用 4-1 程式語言簡介 4-2 結構化VS物件導向程式設計
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
服務教育課程 改制說明會 學生事務處 服務教育組
進階 WWW 程式設計 -- PHP Array 靜宜大學資訊管理學系 蔡奇偉副教授
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
Lambda 學習目標 認識Lambda語法 運用方法參考 瞭解介面預設方法 善用Functional與Stream API
變數、資料型態、運算子.
第6章 PHP基本語法介紹.
103學年度綜高新生家長座談會 報告人:教務主任 莊靜宜.
6 集合类与泛型.
Presentation transcript:

Introduction to lisp lisp

计划 lisp介绍 函数 数据结构 java对比 1.lisp背景介绍 2.通过函数和数据抽象作为解决复杂度的重要工具 3.java8新增的lambda表达式支持和streamapi的简单对比

lisp (list processor) 第一门函数式语言 (1958~) 有很多方言 scheme、commons lisp、racket、 clojure 语法简单,括号很多 函数式编程,是一种编程范式,在任意位置定义函数、把函数当做参数、返回结果。类似数学函数的方式,对于特定的输入返回同样的结果。尽量避免修改状态和数据。 语法非常简单,几乎没有语法,非常快的入手,没有那么多的规则,更多的创造力 主要使用scheme代码,和其他方言基本思想是一致的

动机 另一种编程范式 比较有趣 为什么要去(学习)(了解)一门(新)的(语言) 函数式编程,学习不同的思想、思维方式,从中得到一些启发、灵感。 语言不仅是工具,更是思维的载体,了解另外一个世界的风格。 第二古老的语言,存在这么长时间,肯定是有很多价值的 另外,不考虑太多利益。lisp本身是非常有趣的。

(operator operand1 operand2 …) s-expression s表达式 symbolic expression 前缀表示法 在lisp中既用作代码有用作数据 每个operand可能是一个atom,或者是一个s-expression (operator operand1 operand2 …)

基本表达式 > ( + 2 3 ) 5 > ( * 1 2 3 ) 6 基本计算操作,定义变量 组合式包含组合式,递归替换求值 > ( + ( * 2 3 ) ( + 3 4 ) ) 13 > ( define foo 3 ) > ( * foo foo ) 9

> ( define ( square x ) ( * x x ) ) 定义函数 ( define ( <name> <formal parameters> ) <body>) > ( define ( square x ) ( * x x ) ) > ( square 3 ) 定义function 名称 形式参数 9 > ( define ( sum-of-squares x y ) ( + ( square x ) ( square y ) > ( sum-of-squares 4 3) 25

流程控制 (define ( abs x ) ( if ( > x 0 ) x (- x ) ) ) > (abs -1) 1 通过谓词表达式判断,还有cond > (abs -1) 1 > (abs 2) 2

( define ( plus-y y ) ( define ( plus-x x ) ( + x y ) ) plus-x ) 函数中定义函数 ( define ( plus-y y ) ( define ( plus-x x ) ( + x y ) ) plus-x ) closure闭包,包含函数的定义和当前的环境。创建了一个包含此表达式和对自由变量y的引用的闭包 表示函数体内,包含有外层函数的参数 外层函数返回时,参数的绑定被关闭了 又称lexical scoping static scoping ,在定义函数的代码位置确定变量的值。 与之相对应的是dynamic scoping。可能运行恰好遇到一个也叫y的环境。 Clojure, Common Lisp and Scheme make use of static scoping by default while Newlisp, Picolisp and the embedded languages in Emacs and AutoCAD use dynamic scoping. > ( ( plus-y 3 ) 5 ) 8

( lambda ( <formal parameters> ) <body>) λ-expression ( lambda ( <formal parameters> ) <body>) > ( ( lambda ( x ) ( * x x ) ) 3 ) 9 lambda 表达式 currying 可以将多个参数的lambda表达式转化为多个单参数的lambda 的组合 > ( ( lambda ( x y ) ( + x y ) ) 3 4) 7 > ( (lambda ( x ) ( lambda ( y ) ( + x y ) ) ) 3 ) 4) 7

函数中定义函数 ( define ( plus-y y ) ( define ( plus-x x ) ( + x y ) ) ( lambda ( x ) ( + x y ) ) )

( define ( damping f ) ( lambda ( x ) ( / ( + x ( f x ) ) 2 ) ) ) 函数作为参数、返回值 ( define ( damping f ) ( lambda ( x ) ( / ( + x ( f x ) ) 2 ) ) ) 高阶函数做抽象,输入一个过程返回一个过程,high ordered function > ( ( damping square ) 2 ) 3 ( define ( compose f g) ( lambda ( x ) ( f ( g x ) ) ) ) > ( ( compose square ( lambda ( x ) ( + x 1 ) ) ) 5 ) 36

数据结构 ( cons 1 2 ) > ( cons 1 2 ) 2 ‘(1 . 2) construct pair序对,的car cdr 可以是atom也可以是序对,嵌套递归定义。如同lisp代码结构一样。 说明序对满足闭包性质,代数中的概念,一个集合在一个操作下是闭包的,表示操作的结果也在这个集合内 > (car ( cons 1 2 ) ) 1 1 > (cdr ( cons 1 2 ) ) 2

( cons 1 (cons 2 ( cons 3 nil ) ) ) list nil 1 2 3 nil作为序对的链结束,也可以当做不包含任何元素的序列,空表 (car seq) seq列表的第一个元素 (cdr seq) 去掉第一个元素后的列表 ( cons 1 (cons 2 ( cons 3 nil ) ) ) ( list 1 2 3 )

( append ( list 1 2 3 ) (list 4 5 6 ) ) ‘( 1 2 3 4 5 6 ) ( car (list 4 5 6 ) ) ( list 4 5 6 ) = ( cons 4 ( list 5 6 ) ) 4 ( cdr ( list 4 5 6 ) ) ‘( 5 6 ) (cons 1 ( list 2 3 4 ) ) ‘(1 2 3 4 )

生成一个list ( define ( gen-list start end ) ( if ( > start end ) nil (cons start ( gen-list ( + start 1 ) end ) ) ) ) 递归过程,过程的定义中引用了自己 递归计算过程 迭代计算过程 使用递归表示循环 > ( gen 2 5 ) ‘( 2 3 4 5 ) ( define ( gen-list start end ) ( define ( gen-iter next result ) ( if ( < next start ) result ( gen-iter ( - next 1 ) (cons next result ) ) ) ) ( gen-iter end nil ) )

( my-map proc ( cdr seq ) ) ) ) ) ( map proc seq) ( define ( map proc seq ) ( if ( null? seq ) nil ( cons ( proc ( car seq ) ) ( my-map proc ( cdr seq ) ) ) ) ) 介绍一下最基本的实现。map 映射 一个list 通过一个函数映射到另外一个list。 ( map square ( list 1 2 3 4 5 ) ( 1 4 9 16 25 )

( map ( lambda ( x ) ( + x 1 ) ) ( map square ( gen-list 1 5 ) ) )

(filter predicate seq) ( filter prime? ( gen-list 2 10 ) )

accumulate ( define ( accumulate op init seq ) ( if ( null? seq ) init ( accumulate op ( op ( car seq ) init ) ( cdr seq ) ) ) ) fold-right fold-left ( accumulate + 0 ( list 1 2 3 4 ) ) ( + 1 ( + 2 ( + 3 ( + 4 0))))

flatmap (map (lambda (x) (gen-list 1 x)) (gen-list 1 3)) '((1) (1 2) (1 2 3)) flat map accumulate cons nil 变平 将每个list产生的次级list扩展到外层 ( define ( flatmap proc seq ) ( accumulate append nil ( map proc seq ) ) ) ( flatmap ( lambda ( x ) ( gen-list 1 x ) ) ( gen-list 1 3) ) '(1 1 2 1 2 3)

combine them ( accumulate + 0 ( filter ( lambda ( x ) ( > x 0 ) ) ( map ( lambda ( x ) ( - x 5 ) ) (gen-list 1 10 ) ) )

8皇后问题 queenssssssss!!!!!!!!!!!!!!!!!!!! ( 7, 5, 3, 1, 6, 8, 2, 4)

(define (queens board-size) (define (queen-cols k) (if (= k 0) (list empty-board) (filter (lambda (positions) (safe? k positions)) (flatmap (lambda (rest-of-queens) (map (lambda (new-row) (adjoin-position new-row rest-of-queens)) (gen-list 1 board-size))) (queen-cols (- k 1)))))) (queen-cols board-size))

(define empty-board '()) (define (safe-with-col k i positions) (let ((value-k (list-ref positions (- k 1))) (value-i (list-ref positions (- i 1)))) (nor (= value-k value-i) (= (abs (- i k)) (abs (- value-k value-i)))))) (define (safe? k positions) (define (safe-with i) (if (= i k) true (if (not (safe-with-col k i positions)) false (safe-with (+ i 1))))) (safe-with 1)) (define (adjoin-position new-row rest-of-queens) (append rest-of-queens (list new-row)))

Functional style in Java lambda expression java.util.function Stream API java.util.stream 提出公用模式,建立高层抽象 lambda expression 拥有一个抽象方法的类或接口 intermediate operation terminal operation supplier The identity value must be an identity for the combiner function Collectors reactive programming asynchronous programming with observable streams filter(predicate) flatMap(mapper) forEach(action) map(mapper) collect(collector) reduce(identity, accumulator, combiner)

.filter(w -> w.length() > 4) .count() words.stream() List<String> words = … long count = 0; for (String word : words ) { if ( word.length() > 4 ) { count += 1; } 命令式 imperative 迭代将filter 、 map 、reduce 逻辑放在了一个iterator中,并且是sequential的 使用stream方式把各个元件分离开,并且可以在适当的时候换成parallel的模式parallelStream readable and fluent in order to keep code neat and simple. words.stream() .filter(w -> w.length() > 4) .count() words.stream() .filter(w -> w.length() > 4) .map(w -> 1L) .reduce(0, (a, b) -> a + b))

Collection API Map<String, Integer> wordCountMap = new HashMap<>(); List<String> lines = Files.readAllLines(path); for (String line : lines) { String[] words = WHITE_SPACE.split(line); for (String word : words) { if (word.length() > 4) { if (StringUtils.isNotEmpty(word)) { wordCountMap.merge(word, 1, Integer::sum); }

Stream<String> lines = Files.lines(path); Map<String, Long> wordCount = lines .flatMap(WHITE_SPACE::splitAsStream) .filter(w -> w.length() > 4) .collect(Collectors.groupingBy(w -> w, Collectors.counting()));

推荐的书 计算机程序的构造和解释 Cheers

Thanks & QA