Higher-Order Perl: Transforming Programs with Programs
暫譯: 高階 Perl:用程式轉換程式
Mark Jason Dominus
- 出版商: Morgan Kaufmann
- 出版日期: 2005-03-14
- 定價: $2,800
- 售價: 8.0 折 $2,240
- 語言: 英文
- 頁數: 600
- 裝訂: Paperback
- ISBN: 1558607013
- ISBN-13: 9781558607019
-
相關分類:
Perl 程式語言
立即出貨 (庫存 < 3)
買這商品的人也買了...
-
$880$695 -
$480$379 -
$690$587 -
$590$466 -
$2,710$2,575 -
$680$537 -
$750$638 -
$560$476 -
$750$593 -
$780$702 -
$490$382 -
$480$379 -
$650$553 -
$650$507 -
$460$363 -
$450$383 -
$2,210$2,100 -
$580$452 -
$790$672 -
$620$527 -
$750$593 -
$560$437 -
$880$748 -
$880$695 -
$590$466
相關主題
商品描述
Description:
"Higher-Order Perl is the most exciting, most clearly-written, most comprehensive, and most forward-looking programming book I've read in at least ten years. It's your map to the future of programming in any language."
—Sean M. Burke, Leading Programmer, Comprehensive Perl Archive Network (CPAN)
Most Perl programmers were originally trained as C and Unix programmers, so the Perl programs that they write bear a strong resemblance to C programs. However, Perl incorporates many features that have their roots in other languages such as Lisp. These advanced features are not well understood and are rarely used by most Perl programmers, but they are very powerful. They can automate tasks in everyday programming that are difficult to solve in any other way. One of the most powerful of these techniques is writing functions that manufacture or modify other functions. For example, instead of writing ten similar functions, a programmer can write a general pattern or framework that can then create the functions as needed according to the pattern. For several years Mark Jason Dominus has worked to apply functional programming techniques to Perl. Now Mark brings these flexible programming methods that he has successfully taught in numerous tutorials and training sessions to a wider audience.
Table of Contents:
1. Recursion and Callbacks
1.1 Decimal to Binary Conversion
1.2 Factorial
1.2.1 Why Private Variables are Important
1.3 The Tower of Hanoi
1.4 Hierarchical Data
1.5 Applications and Variations of Directory Walking
1.6 Functional vs. Object-Oriented Programming
1.7 HTML
1.7.1 More Flexible Selection
1.8 When Recursion Blows Up
1.8.1 Fibonacci Numbers
1.8.2 Partitioning
2. Dispatch Tables
2.1 Configuration File Handling
2.1.1 Table-driven configuration
2.1.2 Advantages of Dispatch Tables
2.1.3 Dispatch Table Strategies
2.1.4 Default Actions
2.2 Calculator
2.2.1 HTML Processing Revisited
3. Caching and Memoization
3.1 Caching Fixes Recursion
3.2 Inline Caching
3.2.1 Static Variables
3.3 Good Ideas
3.4 Memoization
3.5 The Memoize Module
3.5.1 Scope and Duration
3.5.1.1 Scope
3.5.1.2 Duration
3.5.2 Lexical Closure
3.5.3 Memoization Again
3.6 Caveats
3.6.1 Functions whose Return Values do not Depend on their Arguments
3.6.2 Functions with Side Effects
3.6.3 Functions that Return References
3.6.4 A Memoized Clock?
3.4.5 Very Fast Functions
3.7 Key Generation
3.7.1 More Applications of User-Supplied Key Generators
3.7.2 Inlined Cache Manager with Argument Normalizer
3.7.3 Functions with Reference Arguments
3.7.4 Partioning
3.7.5 Custom Key Generation for Impure Functions
7.8 Caching in Object Methods
3.8.1 Memoization of Object Methods
3.9 Persistent Caches
3.10 Alternatives to Memoization
3.11 Evangelism
3.12 The Benefits of Speed
3.12.1 Profiling and Performance Analysis
3.12.2 Automatic Profiling
3.12.3 Hooks
4. Iterators
4.1 Introduction
4.1.1 Filehandles are Iterators
4.1.2 Iterators are Objects
4.1.3 Other Common Examples of Iterators
4.2 Homemade Iterators
4.2.1 A Trivial Iterator: upto()
4.2.1.1 Syntactic Sugar for Manufacturing Iterators
4.2.2 dir_walk()
4.2.3 On Clever Inspirations
4.3 Examples
4.3.1 Permutations
4.3.2 Genomic Sequence Generator
4.3.3 Filehandle Iterators
4.3.4 A Flat-File Database
4.3.4.1 Improved Database
4.3.5 Searching Databases Backwards
4.3.5.1 A Query Package that Transforms Iterators
4.3.5.2 An Iterator that Reads Files Backwards
4.3.5.3 Putting it Together
4.3.6 Random Number Generation
4.4 Filters and Transforms
4.4.1 imap()
4.4.2 igrep()
4.4.3 list_iterator()
4.4.4 append()
4.5 The Semipredicate Problem
4.5.1 Avoiding the Problem
4.5.2 Alternative undefs
4.5.3 Rewriting Utilities
4.5.4 Iterators that Return Mulitple Values
4.5.5 Explicit Exhaustion Function
4.5.6 Four-Operation Iterators
4.5.7 Iterator Methods
4.6 Alternative Interfaces to Iterators
4.6.1 Using foreach to Loop over more than one Array
4.6.2 An Iterator with an each-like Interface
4.6.3 Tied Variable Interfaces
4.6.3.1 Summary of tie
4.6.3.2 Tied Scalars
4.6.3.3 Tied Filehandle
4.7 An Extended Example: Web Spiders
4.7.1 Pursuing only Interesting Links
4.7.2 Referring URLs
4.7.3 robots.txt
4.7.4 Summary
5. From Recursion to Iterators
5.1 The Partition Problem Revisited
5.1.1 Finding All Possible Partions
5.1.2 Optimizations
5.1.3 Variations
5.2 How to Convert a Recursive Function to an Iterator
5.3 A Generic Search Iterator
5.4 Other General Techniques for Eliminating Recursion
5.4.1 Tail Call Elimination
5.4.1.1 Someone Else's Problem
5.4.1.2 Creating Tail Calls
5.4.1.3 Explicit Stacks
5.4.1.3.1 Eliminating Recursion from fib()
6. Infinite Streams
6.1 Linked Lists
6.2 Lazy Linked Lists
6.2.1 A Trivial Stream: upto()
6.2.2 Utilities for Streams
6.3 Recursive Streams
6.3.1 Memoizing Streams
6.4 The Hamming Problem
6.5 Regex String Generation
6.5.1 Generating Strings in Order
6.5.2 Regex Matching
6.5.3 Cutsorting
6.5.3.1 Log Files
6.6 The Newton-Raphson Method
6.6.1 Approximation Streams
6.6.2 Derivatives
6.6.3 The Tortoise and the Hare
6.6.4 Finance
6.7 Power Series
6.7.1 Derivatives
6.7.2 Other Functions
6.7.3 Symbolic Computation
7. Higher-Order Functions and Currying
7.1 Currying
7.2 Common Higher-Order Functions
7.2.1 Automatic Currying
7.2.2 Prototypes
7.2.2.1 Prototype Problems
7.2.3 More Currying
7.2.4 Yet More Currying
7.3 reduce() and combine()
7.3.1 Boolean Operators
7.4 Databases
7.4.1 Operator Overloading
8. Parsing
8.1 Lexers
8.1.1 Emulating the <> operator
8.1.2 Lexers More Generally
8.1.3 Chained Lexers
8.1.4 Peeking
8.2 Parsing in General
8.2.1 Grammars
8.2.2 Parsing Grammars
8.3 Recursive Descent Parsers
8.3.1 Very Simple Parsers
8.3.2 Parser Operators
8.3.3 Compound Operators
8.4 Arithmetic Expressions
8.4.1 A Calculator
8.4.2 Left Recursion
8.4.3 A Variation on star()
8.4.4 Generic Operator Parsers
8.4.5 Debugging
8.4.6 The Finished Calculator
8.4.7 Error Diagnosis and Recovery
8.4.7.1 Error Recovery Parsers
8.4.7.2 Exceptions
8.4.8 Big Numbers
8.5 Parsing Regexes
8.6 Outlines
8.7 Databases Query Parsing
8.7.1 The Lexer
8.7.2 The Parser
8.8 Backtracking Parsers
8.8.1 Continuations
8.8.2 Parse Streams
8.9 Overloading
9. Declarative Programming
9.1 Constraint Systems
9.2 Local Propagation Networks
9.2.1 Implementing a Local Propagation Network
9.2.2 Problems with Local Propagation
9.3 Linear Equations
9.4 linogram: a drawing system
9.4.1 Equations
9.4.1.1 ref($base) || $base
9.4.1.2 Solving Equations
9.4.1.3 Constraints
9.4.2 Values
9.4.2.1 Constant Values
9.4.2.2 Tuple Values
9.4.2.3 Feature Values
9.4.2.4 Intrinsic Constraints
9.4.2.5 Synthetic Constraints
9.4.2.6 Feature Value Methods
9.4.3 Feature Types
9.4.3.1 Scalar Types
9.4.3.2 Type methods
9.4.4 The Parser
9.4.4.1 Parser Extensions
9.4.4.2 %TYPES
9.4.4.3 Programs
9.4.4.4 Definitions
9.4.4.5 Declarations
9.4.4.6 Expressions
9.4.5 Missing Features
9.5 Conclusion
商品描述(中文翻譯)
**描述:**
「Higher-Order Perl 是我在至少十年內讀過的最令人興奮、最清晰、最全面且最具前瞻性的程式設計書籍。它是你通往任何語言程式設計未來的地圖。」
—Sean M. Burke,領先程式設計師,綜合 Perl 檔案庫網路 (CPAN)
大多數 Perl 程式設計師最初都是以 C 和 Unix 程式設計師的身份接受訓練,因此他們所寫的 Perl 程式與 C 程式有著很強的相似性。然而,Perl 融合了許多源自其他語言(如 Lisp)的特性。這些進階特性並不為大多數 Perl 程式設計師所理解,且很少被使用,但它們非常強大。它們可以自動化日常程式設計中難以用其他方式解決的任務。其中一種最強大的技術是編寫製造或修改其他函數的函數。例如,程式設計師可以編寫一個通用的模式或框架,然後根據該模式按需創建函數,而不是編寫十個相似的函數。幾年來,Mark Jason Dominus 一直致力於將函數式程式設計技術應用於 Perl。現在,Mark 將這些他在眾多教程和培訓課程中成功教授的靈活程式設計方法帶給更廣泛的受眾。
**目錄:**
1. 遞迴與回呼
1.1 十進位轉二進位
1.2 階乘
1.2.1 為什麼私有變數很重要
1.3 河內塔
1.4 階層數據
1.5 目錄遍歷的應用與變體
1.6 函數式與物件導向程式設計
1.7 HTML
1.7.1 更靈活的選擇
1.8 當遞迴失控時
1.8.1 費波那契數列
1.8.2 分割
2. 派遣表
2.1 配置文件處理
2.1.1 表驅動配置
2.1.2 派遣表的優勢
2.1.3 派遣表策略
2.1.4 預設行為
2.2 計算器
2.2.1 HTML 處理重訪
3. 快取與備忘錄
3.1 快取修正遞迴
3.2 行內快取
3.2.1 靜態變數
3.3 好主意
3.4 備忘錄
3.5 Memoize 模組
3.5.1 範圍與持續時間
3.5.1.1 範圍
3.5.1.2 持續時間
3.5.2 詞法閉包
3.5.3 再次備忘錄
3.6 注意事項
3.6.1 返回值不依賴於其參數的函數
3.6.2 具有副作用的函數
3.6.3 返回引用的函數
3.6.4 一個備忘錄時鐘?
3.4.5 非常快速的函數
3.7 密鑰生成
3.7.1 用戶提供的密鑰生成器的更多應用
3.7.2 帶有參數標準化的行內快取管理器
3.7.3 具有引用參數的函數
3.7.4 分割
3.7.5 不純函數的自定義密鑰生成
3.8 物件方法中的快取
3.8.1 物件方法的備忘錄
3.9 持久快取
3.10 備忘錄的替代方案
3.11 宣傳
3.12 速度的好處
3.12.1 性能分析與剖析
3.12.2 自動剖析
3.12.3 鉤子
4. 迭代器
4.1 介紹
4.1.1 文件句柄是迭代器
4.1.2 迭代器是物件
4.1.3 其他常見的迭代器範例
4.2 自製迭代器
4.2.1 一個微不足道的迭代器:`upto()`
4.2.1.1 製造迭代器的語法糖
4.2.2 `dir_walk()`
4.2.3 聰明的靈感
4.3 範例
4.3.1 排列組合
4.3.2 基因序列生成器
4.3.3 文件句柄迭代器
4.3.4 扁平文件數據庫
4.3.4.1 改進的數據庫
4.3.5 反向搜索數據庫
4.3.5.1 轉換迭代器的查詢包
4.3.5.2 一個反向讀取文件的迭代器
4.3.5.3 整合
4.3.6 隨機數生成
4.4 過濾器與轉換
4.4.1 `imap()`
4.4.2 `igrep()`
4.4.3 `list_iterator()`
4.4.4 `append()`
4.5 半謂詞問題
4.5.1 避免問題
4.5.2 替代的 `undef`
4.5.3 重寫工具
4.5.4 返回多個值的迭代器
4.5.5 明確的耗盡函數
4.5.6 四運算迭代器
4.5.7 迭代器方法
4.6 迭代器的替代介面
4.6.1 使用 `foreach` 迴圈遍歷多個數組
4.6.2 具有 `each` 類似介面的迭代器
4.6.3 綁定變數介面
4.6.3.1 `tie` 的摘要
4.6.3.2 綁定標量
4.6.3.3 綁定文件句柄
4.7 擴展範例:網路爬蟲
4.7.1 僅追蹤有趣的連結
4.7.2 參考 URL
4.7.3 `robots.txt`
4.7.4 總結
5. 從遞迴到迭代器
5.1 重新檢視分割問題
5.1.1 找到所有可能的分割
5.1.2 優化
5.1.3 變體
5.2 如何將遞迴函數轉換為迭代器
5.3 一個通用的搜索迭代器
5.4 消除遞迴的其他通用技術
5.4.1 尾調消除
5.4.1.1 其他人的問題
5.4.1.2 創建尾調
5.4.1.3 明確堆疊
5.4.1.3.1 消除 `fib()` 中的遞迴
6. 無限流
6.1 鏈表
6.2 懶鏈表
6.2.1 一個微不足道的流:`upto()`
6.2.2 流的工具
6.3 遞迴流
6.3.1 備忘錄流
6.4 哈明問題
6.5 正則表達式字符串生成
6.5.1 按順序生成字符串
6.5.2 正則匹配
6.5.3 切割排序
6.5.3.1 日誌文件
6.6 牛頓-拉夫森法
6.6.1 近似流
6.6.2 導數
6.6.3 烏龜與兔子
6.6.4 財務
6.7 幂級數
6.7.1 導數
6.7.2 其他函數
6.7.3 符號計算
7. 高階函數與柯里化
7.1 柯里化
7.2 常見的高階函數
7.2.1 自動柯里化
7.2.2 原型
7.2.2.1 原型問題
7.2.3 更多柯里化
7.2.4 更加柯里化
7.3 `reduce()` 與 `combine()`
7.3.1 布林運算符
7.4 數據庫
7.4.1 運算符重載
8. 解析
8.1 詞法分析器
8.1.1 模擬 `< >` 運算符
8.1.2 更一般的詞法分析器
8.1.3 鏈接詞法分析器
8.1.4 觀察
8.2 一般解析
8.2.1 文法
8.2.2 解析文法
8.3 遞迴下降解析器
8.3.1 非常簡單的解析器
8.3.2 解析運算符
8.3.3 複合運算符
8.4 算術表達式
8.4.1 一個計算器
8.4.2 左遞迴
8.4.3 `star()` 的變體
8.4.4 通用運算符解析器
8.4.5 除錯
8.4.6 完成的計算器
8.4.7 錯誤診斷與恢復
8.4.7.1 錯誤恢復解析器
8.4.7.2 異常
8.4.8 大數字
8.5 解析正則表達式
8.6 大綱
8.7 數據庫查詢解析
8.7.1 詞法分析器
8.7.2 解析器
8.8 回溯解析器
8.8.1 繼續
8.8.2 解析流
8.9 重載
9. 宣告式程式設計
9.1 約束系統
9.2 局部傳播網絡
9.2.1 實現局部傳播網絡
9.2.2 局部傳播的問題
9.3 線性方程
9.4 `linogram`:一個繪圖系統
9.4.1 方程
9.4.1.1 `ref($base) || $base`
9.4.1.2 解方程
9.4.1.3 約束
9.4.2 值
9.4.2.1 常數值
9.4.2.2 元組值
9.4.2.3 特徵值
9.4.2.4 內在約束
9.4.2.5 合成約束
9.4.2.6 特徵值方法
9.4.3 特徵類型
9.4.3.1 標量類型
9.4.3.2 `Type` 方法
9.4.4 解析器
9.4.4.1 解析器擴展
9.4.4.2 `%TYPES`
9.4.4.3 程式
9.4.4.4 定義
9.4.4.5 聲明
9.4.4.6 表達式
9.4.5 缺失的特徵
9.5 結論