100% found this document useful (2 votes)
15 views

Instant download Source Code Analytics With Roslyn and JavaScript Data Visualization Mukherjee pdf all chapter

Code

Uploaded by

jarmagault14
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
15 views

Instant download Source Code Analytics With Roslyn and JavaScript Data Visualization Mukherjee pdf all chapter

Code

Uploaded by

jarmagault14
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 65

Download the Full Version of textbook for Fast Typing at textbookfull.

com

Source Code Analytics With Roslyn and JavaScript


Data Visualization Mukherjee

https://textbookfull.com/product/source-code-analytics-with-
roslyn-and-javascript-data-visualization-mukherjee/

OR CLICK BUTTON

DOWNLOAD NOW

Download More textbook Instantly Today - Get Yours Now at textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Code Generation with Roslyn Nick Harrison

https://textbookfull.com/product/code-generation-with-roslyn-nick-
harrison/

textboxfull.com

D3.js in Action: Data visualization with JavaScript 2nd


Edition Elijah Meeks

https://textbookfull.com/product/d3-js-in-action-data-visualization-
with-javascript-2nd-edition-elijah-meeks/

textboxfull.com

D3 js in Action Data visualization with JavaScript Second


Edition Elijah Meeks

https://textbookfull.com/product/d3-js-in-action-data-visualization-
with-javascript-second-edition-elijah-meeks/

textboxfull.com

Data Visualization with Python and JavaScript Scrape Clean


Explore Transform Your Data 1st Edition Kyran Dale

https://textbookfull.com/product/data-visualization-with-python-and-
javascript-scrape-clean-explore-transform-your-data-1st-edition-kyran-
dale/
textboxfull.com
Begin to Code with JavaScript 1st Edition Miles

https://textbookfull.com/product/begin-to-code-with-javascript-1st-
edition-miles/

textboxfull.com

Data Visualization Toolkit Using JavaScript Rails and


Postgres to Present Data and Geospatial Information
Barrett Clark
https://textbookfull.com/product/data-visualization-toolkit-using-
javascript-rails-and-postgres-to-present-data-and-geospatial-
information-barrett-clark/
textboxfull.com

Practical Python Data Visualization: A Fast Track Approach


To Learning Data Visualization With Python Ashwin Pajankar

https://textbookfull.com/product/practical-python-data-visualization-
a-fast-track-approach-to-learning-data-visualization-with-python-
ashwin-pajankar/
textboxfull.com

Neuroimaging, Software, and Communication: The Social Code


of Source Code Edison Bicudo

https://textbookfull.com/product/neuroimaging-software-and-
communication-the-social-code-of-source-code-edison-bicudo/

textboxfull.com

Data Visualization with D3 4 x Cookbook Nick Zhu

https://textbookfull.com/product/data-visualization-
with-d3-4-x-cookbook-nick-zhu/

textboxfull.com
Source Code
Analytics With
Roslyn and
JavaScript Data
Visualization

Sudipta Mukherjee
Foreword by Dr. Darius Blasband
Source Code Analytics
With Roslyn and
JavaScript Data
Visualization

Sudipta Mukherjee
Foreword by Dr. Darius Blasband
Source Code Analytics With Roslyn and JavaScript Data Visualization
Sudipta Mukherjee
Varthur Hobli, India
ISBN-13 (pbk): 978-1-4842-1924-9 ISBN-13 (electronic): 978-1-4842-1925-6
DOI 10.1007/978-1-4842-1925-6
Library of Congress Control Number: 2016961817
Copyright © 2016 by Sudipta Mukherjee
This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information storage
and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now known or
hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are
not identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the material
contained herein.
Managing Director: Welmoed Spahr
Lead Editor: Todd Green
Technical Reviewer: Abhishek Gupta
Editorial Board: Steve Anglin, Pramila Balan, Laura Berendson, Aaron Black, Louise Corrigan,
Jonathan Gennick, Todd Green, Robert Hutchinson, Celestin Suresh John, Nikhil Karkal,
James Markham, Susan McDermott, Matthew Moodie, Natalie Pao, Gwenan Spearing
Coordinating Editor: Jill Balzano
Copy Editor: Corbin Collins
Compositor: SPi Global
Indexer: SPi Global
Artist: SPi Global
Distributed to the book trade worldwide by Springer Science+Business Media New York,
233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail
[email protected], or visit www.springer.com. Apress Media, LLC is a California LLC and the sole
member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is
a Delaware corporation.
For information on translations, please e-mail [email protected], or visit www.apress.com.
Apress and friends of ED books may be purchased in bulk for academic, corporate, or promotional use. eBook
versions and licenses are also available for most titles. For more information, reference our Special Bulk
Sales–eBook Licensing web page at www.apress.com/bulk-sales.
Any source code or other supplementary materials referenced by the author in this text are available to
readers at www.apress.com. For detailed information about how to locate your book’s source code, go to
www.apress.com/source-code/. Readers can also access source code at SpringerLink in the Supplementary
Material section for each chapter.
Printed on acid-free paper
To Mou, for never giving up on me
Contents at a Glance

Foreword��������������������������������������������������������������������������������������������������������������� xiii
About the Author�����������������������������������������������������������������������������������������������������xv
About the Technical Reviewer�������������������������������������������������������������������������������xvii
Acknowledgments��������������������������������������������������������������������������������������������������xix
Introduction������������������������������������������������������������������������������������������������������������xxi


■Chapter 1: Meet Roslyn Syntax API����������������������������������������������������������������������� 1

■Chapter 2: Code Quality Metrics�������������������������������������������������������������������������� 15

■Chapter 3: Design Quality Metrics����������������������������������������������������������������������� 45

■Chapter 4: Code Performance Metrics����������������������������������������������������������������� 71

■Chapter 5: Code Mining��������������������������������������������������������������������������������������� 91

■Chapter 6: Code Forensics��������������������������������������������������������������������������������� 131

■Chapter 7: Code Visualization���������������������������������������������������������������������������� 155

Index��������������������������������������������������������������������������������������������������������������������� 167

v
Contents

Foreword��������������������������������������������������������������������������������������������������������������� xiii
About the Author�����������������������������������������������������������������������������������������������������xv
About the Technical Reviewer�������������������������������������������������������������������������������xvii
Acknowledgments��������������������������������������������������������������������������������������������������xix
Introduction������������������������������������������������������������������������������������������������������������xxi


■Chapter 1: Meet Roslyn Syntax API����������������������������������������������������������������������� 1
Syntax Tree Methods�������������������������������������������������������������������������������������������������������� 1
GetRoot��������������������������������������������������������������������������������������������������������������������������������������������������� 1
DescendantNodes����������������������������������������������������������������������������������������������������������������������������������� 2
DescendantTrivia������������������������������������������������������������������������������������������������������������������������������������ 2
DescendantTokens��������������������������������������������������������������������������������������������������������������������������������� 2
Ancestors ����������������������������������������������������������������������������������������������������������������������������������������������� 3

Important Types ��������������������������������������������������������������������������������������������������������������� 3


MethodDeclarationSyntax ��������������������������������������������������������������������������������������������������������������������� 3
ClassDeclarationSyntax ������������������������������������������������������������������������������������������������������������������������� 4
SructDeclarationSyntax ������������������������������������������������������������������������������������������������������������������������� 5
InterfaceDeclarationSyntax ������������������������������������������������������������������������������������������������������������������� 5
IndexerDeclarationSyntax����������������������������������������������������������������������������������������������������������������������� 5
PropertyDeclarationSyntax �������������������������������������������������������������������������������������������������������������������� 6
ForStatementSyntax������������������������������������������������������������������������������������������������������������������������������� 7
ConstructorDeclarationSyntax���������������������������������������������������������������������������������������������������������������� 7
ForEachStatementSyntax����������������������������������������������������������������������������������������������������������������������� 8
SwitchStatementSyntax������������������������������������������������������������������������������������������������������������������������� 8

vii
■ Contents

ParameterSyntax������������������������������������������������������������������������������������������������������������������������������������ 9
DoStatementSyntax�������������������������������������������������������������������������������������������������������������������������������� 9
UsingStatementSyntax������������������������������������������������������������������������������������������������������������������������� 10
IfStatementSyntax�������������������������������������������������������������������������������������������������������������������������������� 11
TryStatementSyntax����������������������������������������������������������������������������������������������������������������������������� 11
ConditionalExpressionSyntax��������������������������������������������������������������������������������������������������������������� 13
ParenthesizedLambdaExpressionSyntax���������������������������������������������������������������������������������������������� 13
WhileStatementSyntax������������������������������������������������������������������������������������������������������������������������� 13

Summary������������������������������������������������������������������������������������������������������������������������ 14

■Chapter 2: Code Quality Metrics�������������������������������������������������������������������������� 15
Setting Up LINQPad to Use Roslyn��������������������������������������������������������������������������������� 16
Magic Numbers in Mathematics������������������������������������������������������������������������������������ 18
Magic Numbers Used in Index ������������������������������������������������������������������������������������� 20
Magic Numbers Used in Conditions ������������������������������������������������������������������������������ 21
Ladder if Statements ����������������������������������������������������������������������������������������������������� 24
Fragmented Conditions ������������������������������������������������������������������������������������������������� 25
Hungarian Names for Variables ������������������������������������������������������������������������������������ 27
Lots of Local Variables in Methods��������������������������������������������������������������������������������� 30
Methods Not Using All Parameters��������������������������������������������������������������������������������� 31
Multiple Return Statements ���������������������������������������������������������������������������������������� 32
Long Parameter Lists����������������������������������������������������������������������������������������������������� 33
goto Labels �������������������������������������������������������������������������������������������������������������������� 35
Large Class �������������������������������������������������������������������������������������������������������������������� 37
Lines of Code ����������������������������������������������������������������������������������������������������������������� 38
Control Flags������������������������������������������������������������������������������������������������������������������ 40
Code-to-Comment Ratio ������������������������������������������������������������������������������������������������ 42
Summary������������������������������������������������������������������������������������������������������������������������ 44

viii
■ Contents


■Chapter 3: Design Quality Metrics����������������������������������������������������������������������� 45
Deeply Nested Loops ����������������������������������������������������������������������������������������������������� 45
Out Parameters�������������������������������������������������������������������������������������������������������������� 47
Deeply Nested if Blocks (Bow and Arrow)���������������������������������������������������������������������� 49
Long List of Switches ���������������������������������������������������������������������������������������������������� 51
Data Classes (That Aren’t Classes) �������������������������������������������������������������������������������� 52
Local Classes����������������������������������������������������������������������������������������������������������������� 54
Refused Bequest������������������������������������������������������������������������������������������������������������ 55
Lots of Overloaded Versions of a Method����������������������������������������������������������������������� 58
Empty Interfaces ����������������������������������������������������������������������������������������������������������� 60
Too Many Parameters on Generic Types������������������������������������������������������������������������� 61
Static Members on Generic Types���������������������������������������������������������������������������������� 63
Abstract Types with Constructors ���������������������������������������������������������������������������������� 64
Sealed Class and Protected Members��������������������������������������������������������������������������� 66
Object Obsession ����������������������������������������������������������������������������������������������������������� 67
Summary������������������������������������������������������������������������������������������������������������������������ 69

■Chapter 4: Code Performance Metrics����������������������������������������������������������������� 71
Avoid Boxing ������������������������������������������������������������������������������������������������������������������ 71
Avoid Using dynamic by Default������������������������������������������������������������������������������������� 73
Avoid Excessive Local Variables������������������������������������������������������������������������������������� 74
Prefer Literals Over Evaluation��������������������������������������������������������������������������������������� 75
Avoid volatile Declarations��������������������������������������������������������������������������������������������� 77
Don’t Use an Object Array in params����������������������������������������������������������������������������� 78
Avoid Unnecessary Projections ������������������������������������������������������������������������������������� 79
Value Types Should Override Equals and GetHashCode ������������������������������������������������ 81
Avoid Using Empty Strings to Find Zero Length Strings������������������������������������������������� 83
Prefer “Jagged” Arrays over Multidimentional Arrays���������������������������������������������������� 85

ix
■ Contents

Don’t Return Array from a Property ������������������������������������������������������������������������������� 86


Don’t Use Thread.Abort or Thread.Suspend������������������������������������������������������������������� 88
Summary ����������������������������������������������������������������������������������������������������������������������� 90

■Chapter 5: Code Mining��������������������������������������������������������������������������������������� 91
Useful Patterns in Code Mining�������������������������������������������������������������������������������������� 91
Identifying Near Duplicate Code����������������������������������������������������������������������������������������������������������� 91
Plagarism Detection����������������������������������������������������������������������������������������������������������������������������� 92
Source Code Forensics������������������������������������������������������������������������������������������������������������������������� 93
Knowledge Mining�������������������������������������������������������������������������������������������������������������������������������� 93

SmartDiff: A Smart Code Comparer�������������������������������������������������������������������������������� 93


Anatomy of a Code Block����������������������������������������������������������������������������������������������� 94
Anatomy of a Property Declaration ������������������������������������������������������������������������������������������������������ 94
Anatomy of a Method��������������������������������������������������������������������������������������������������������������������������� 95
Anatomy of a Class����������������������������������������������������������������������������������������������������������������������������� 100

Detecting Plagarism����������������������������������������������������������������������������������������������������� 103


Completely Duplicate Code����������������������������������������������������������������������������������������������������������������� 103
Almost Duplicate Code����������������������������������������������������������������������������������������������������������������������� 105

Knowledge Mining ������������������������������������������������������������������������������������������������������� 108


Design Pattern Mining������������������������������������������������������������������������������������������������������������������������ 108
Mining Frequent Nested Patterns in Code������������������������������������������������������������������������������������������ 123
API Mining������������������������������������������������������������������������������������������������������������������������������������������ 127

Summary���������������������������������������������������������������������������������������������������������������������� 130

■Chapter 6: Code Forensics��������������������������������������������������������������������������������� 131
What Is Developer Style?��������������������������������������������������������������������������������������������� 131
Elements of Style��������������������������������������������������������������������������������������������������������� 132
MethodsPerClass�������������������������������������������������������������������������������������������������������������������������������� 132
ClassesPerNamespace����������������������������������������������������������������������������������������������������������������������� 133
PublicMethodsPerClass���������������������������������������������������������������������������������������������������������������������� 133
PrivateMethodsPerClass��������������������������������������������������������������������������������������������������������������������� 133

x
■ Contents

ProtectedMethodsPerClass���������������������������������������������������������������������������������������������������������������� 133
OverriddenMethodsPerClass�������������������������������������������������������������������������������������������������������������� 133
ParametersPerMethod������������������������������������������������������������������������������������������������������������������������ 133
StaticClassesPerNamespace�������������������������������������������������������������������������������������������������������������� 133
SealedClassesPerNamespace������������������������������������������������������������������������������������������������������������ 133
PercentageOfMethodsWithVerbs�������������������������������������������������������������������������������������������������������� 134
PercentageOfEnglishWordsUsed�������������������������������������������������������������������������������������������������������� 134
CodeToCommentRatio������������������������������������������������������������������������������������������������������������������������ 134
Vector Representation of Style ���������������������������������������������������������������������������������������������������������� 134

Getting the Data for Experimentation��������������������������������������������������������������������������� 134


Creating the Profile Vector������������������������������������������������������������������������������������������� 135
Finding MethodsPerClass������������������������������������������������������������������������������������������������������������������� 136
Finding ClassesPerNamespace���������������������������������������������������������������������������������������������������������� 137
Finding Methods That Are of a Given Type������������������������������������������������������������������������������������������ 137
Finding ParametersPerMethod����������������������������������������������������������������������������������������������������������� 138
Finding Sealed and Static Classes ���������������������������������������������������������������������������������������������������� 139
Finding PercentageOfMethodsWithVerbs������������������������������������������������������������������������������������������� 139
Finding PercentageOfEnglishWordTokens������������������������������������������������������������������������������������������ 140
Finding CodeToCommentRatio������������������������������������������������������������������������������������������������������������ 142
Generating CSV from the Profile �������������������������������������������������������������������������������������������������������� 142

We Have Profile Vectors—Now What?������������������������������������������������������������������������� 144


kNN (k nearest neighbor) ������������������������������������������������������������������������������������������������������������������� 144

Demo on Troelson and Freeman’s Code����������������������������������������������������������������������� 147


Calculating Accuracy of the System����������������������������������������������������������������������������� 148
Demo on GitHub Repositories��������������������������������������������������������������������������������������� 149
Non-Obvious Usages of Code Forensics����������������������������������������������������������������������� 150
Mentor-Mentee Association���������������������������������������������������������������������������������������������������������������� 150
Data-Driven Developer Rotation��������������������������������������������������������������������������������������������������������� 152

Summary���������������������������������������������������������������������������������������������������������������������� 154

xi
■ Contents


■Chapter 7: Code Visualization���������������������������������������������������������������������������� 155
Parts of a D3.js Script�������������������������������������������������������������������������������������������������� 155
Creating a Bubble Chart����������������������������������������������������������������������������������������������� 158
Finding the Aspect Ratio of Methods ������������������������������������������������������������������������������������������������� 158
Generating JSON from the List of Tuples ������������������������������������������������������������������������������������������� 159

Re-using the Same Code for Other Types of Charts ���������������������������������������������������� 163
A Different Graph to Show Dense Namespaces����������������������������������������������������������� 164
Summary ��������������������������������������������������������������������������������������������������������������������� 165

Index��������������������������������������������������������������������������������������������������������������������� 167

xii
Foreword

The world of programming used to be simple.


We had merely our own stuff to care for. We could proudly claim we knew everything there was to know
about the code we wrote and maintained. At worst, all we had to do was to go and peek. It was all in the
source code, in small enough volumes for us to massage it, understand it, master it entirely. We knew what to
look for. We knew where to look.
It was a much simpler world indeed.
Because things have changed dramatically. We routinely manage code we inherit, code we download,
code other people write. Even the code we write ourselves is growing much faster than it did before. We are
way past the stage where our knowledge is a reliable-enough oracle for the facts buried in our code. We are
also long past the stage where we can perform changes across the board, just by being super good with a text
editor, macros, shortcuts, and all. Because of volume, because of complexity, large-scale refactorings have
turned to software projects in their own right.
For a long time, metaprogramming (writing programs that operate on other programs) has been a
nerdish way for software engineers to keep busy, but it has now come to industrial relevance. One cannot
rely on human knowledge and work power to gather accurate information about software systems, and even
less transform them systematically. They have just gotten too big, too complex, and are evolving too fast for
the roll-your-sleeves-up-and-get-going attitude to be an option any longer. One must be able to automate
many tasks that analyze and/or transform non-trivial software systems.
To compound the difficulty, until recently, metaprogramming required highly specialized tools and
equally specialized languages. That should not come as a surprise: Would you really want to write COBOL
code to process a COBOL program in any non-trivial way? Or even C for C programs? This gap of abstraction
and sophistication between the languages one processes and the languages one uses to develop such
metaprograms has seriously limited the adoption of metaprogramming in the industry. It was a niche thing.
This book, together with Roslyn, are major contributions to get metaprogramming out of this niche
status. They don’t just advocate and demonstrate metaprogramming as a generic technique, but focus on
circular meta-programming, where a widely used general-purpose language is used to manipulate real-
world programs written in this same language.
It is not the first such circular effort though: The now defunct Jackpot project aimed to do exactly that
for Java, and I can only think of the market’s maturity as an explanation for Roslyn’s momentum and success
in comparison. Even before Jackpot, circular metaprogramming was not unheard of, but was limited to more
marginal languages such as Prolog, Lisp, Smalltalk, or YAFL (developed by yours truly).
Sudipta’s demonstration is only marginally about what he achieves using C#, Roslyn, and LINQ,
building on his previous book on the topic. Anyone (including myself ) could argue about the merits of the
problems he solves, his approach, and his solutions, but that would be missing the whole point. His book
is all about demonstrating how Roslyn and LINQ have made metaprogramming simple. It does not have to
be a highly specialized activity any longer. It can and should be part of every serious software developer’s
toolbox.

xiii
■ Foreword

Nowhere is this point about DIY metaprogramming more obvious than in the chapter about
visualization, where he shows how one can connect with existing (often freely available) software
components to best depict whatever it is he wants to emphasize, demonstrate, isolate—in a nutshell,
visualize. In a few dozen lines of code, he shows how the most intricate, project-specific metric or factoid can
be rendered effectively.
In this area, I am personally into arrow and graphs more than dots of varying magnitude, pie, and bar
charts. All a matter of taste. Quite logically, graphviz is my logical favorite rendition tool.
But my opinion is irrelevant. And with all due respect, so is Sudipta’s. What really matters is your
opinion, and how you can put metaprogramming to the best use possible to solve the problems you face,
address your concerns, integrate in your environment, and adapt to your ways of working and thinking. And
on your way to get there, this book is an invaluable contribution.
—Dr. Darius Blasband, CEO raincode.com

xiv
About the Author

Sudipta Mukherjee is an experienced programmer, born in Shibpur, a


town in the Howrah district of West Bengal in India. He grew up in Bally,
another small town in the Howrah district. He has been working with
Roslyn since the first CTP release and is an enthusiastic advocate for
building source code analysis systems. Sudipta is a prolific author. His
previous books include Data Structures Using C (http://goo.gl/pttSh),
.NET 4.0 Generics: Beginner’s Guide (http://goo.gl/LwVmZ5), F# for
Machine Learning Essentials (http://amzn.to/2bAUG5i), and Thinking in
LINQ (http://amzn.to/2e2YEUq). His interests include data structures,
algorithms, text processing, machine learning, natural language
processing, programming languages, and tools development. When not
working at his day job or writing books, Sudipta likes to spend time with
his family and follow his passions of sketching and painting. Sudipta lives
in Bangalore and can be contacted via email at [email protected] or
on Twitter, at @samthecoder.

xv
About the Technical Reviewer

Abhishek Gupta is an Azure and Xamarin Specialist with seven years of


corporate work experience, including three years at Microsoft Hyderabad.
His knowledge areas include algorithms and data structures, operating
systems, basics of machine learning, cloud computing, and smartphone
app development for Android, iOS, and Windows Phone. He is interested
mainly in Microsoft technologies. Abhishek loves learning new
technologies and frameworks, and most of the time finds himself getting
his hands dirty in new APIs. Whenever he has free time, he loves driving
to places full of nature, trekking, and writing blogs (which you can read at
http://cloudandmobile.in).

xvii
Acknowledgments

First, I want to thank the Microsoft Roslyn team for constantly evolving the API to make it cover more
features of C#. As this book is being written, the next version of the C# compiler is being built using Roslyn.
If you have ever tried to create analyzers for source code and been faced with the enormous challenge of
writing your own parsers, then this book is for you, and Roslyn is your savior.
Although my name appears on the book as author, this book wouldn’t have been possible without
the support from my editors at Apress. I especially want to mention Jill Balzano and Todd Green for being
patient and supportive when I missed some of the deadlines for chapter delivery. Thank you both for being
nice and kind.
I want to thank Dr. Darius Blasband, CEO of Raincode (www.raincode.com) for kindly writing the
foreword.
Last but not the least, I want to thank my wife Mou for always being there and being supportive. Since
last time, my son graduated. He’s now potty trained. So much has changed since this picture was taken. He is
taller, sharper.

What hasn’t changed, though, is his love for computers and typing. Here is what he typed, sitting on my
computer.

xix
■ Acknowledgments

I saved the file by his name. He now learned to type his name but is not quite accustomed to the
feather touch keyboard yet—that’s why all the duplicate characters. I think when I write again, he will start
programming.
Finally, I want to thank my Lord for giving me courage and dreams!

xx
Introduction

Metaprogramming is programming to analyze another program. The biggest challenge in doing


metaprogramming is being able to understand the program. To understand the program, we must be able to
parse the program. But parsing is a non-trivial process, and good quality parsers have been living inside the
compiler ever since.
So, compilers used to see it all. They saw the source code and generated the parse tree and finally the
machine instructions. However, everything happened inside the compiler and therefore couldn’t be re-used.
Worse, compilers used to forget everything after generating the machine-executible instructions.
Meet Roslyn from Microsoft. It changes all that. Roslyn is a compiler-as-a-service. That means we
can now tap into the enormous knowledge generated by the compiler, ask intelligent and deep questions
about the code, and build analyzers for given source code more easily than ever before. Roslyn removed the
barriers for metaprogramming.
This book will not teach you all of Roslyn—Roslyn is huge. But it will teach you some part of the Syntax
Parsing API and how to use it to generate several code-related metrics. You will see how these generated
results can be glued to beautiful state-of-the-art data visualization using the JavaScript framework to be
rendered on your browser. By the way, as I write this Roslyn is in active development, so if you see that some
query is not running, please drop me a line and I’ll help you. All the source code is available for download
from Apress.
Sound exciting? Please start reading. I bet you will enjoy it!

xxi
CHAPTER 1

Meet Roslyn Syntax API

Until recently the biggest challenge for metaprogramming in .NET was that there was not a decent C# parser
that could have been used to parse C# programs with confidence and keep up with the modifications made
in the language specification. Some companies and individuals (including yours truly) have had to write
their own parser to parse C# source code—because parsing is the first step to analyzing source code. Till
Roslyn came into picture, compilers used to be like black boxes. Source code used to go at one end, and
machine instructions/executibles came out the other end. However, in parsing code, compilers gained lot
of knowledge, all of which used to get lost in the process. This knowledge could have served as the basis for
writing analyzers.
In this chapter I walk you through some of the key types in the Roslyn Syntax Parsing API for C#.
Knowledge of these types will be essential to be able to follow along with examples in the rest of the book.
One important thing you may note when working with Roslyn is that Roslyn has special names for
coding constructs—different than what you know from your coding experience. For example, any node apart
from code node is called trivia, and a comment is a type of a trivia. If you take a primer class in compiler
design, it will start to make sense why some of the types are named the way they are; however, for general
purpose of writing the analyzers it is not needed.
After reading this chapter you should be able to make sense of several types in Roslyn Syntax Parsing
API, be able to appreciate their existence, and potentially be in a position to apply this knowledge to write
your own analyzers for source code—and follow along examples for the rest of the book.
The following sections walk you through some of the important methods of the SyntaxTree class that
are used more frequently than others while writing the analyzers.

Syntax Tree Methods


I have used LINQPad to capture the tool-tips so you see the general usages and the signature of the methods.

GetRoot
This method gets the root of the syntax tree. This is the first step to write any analyzer. See how this method
is used in Figure 1-1.

Electronic supplementary material The online version of this chapter (doi:10.1007/978-1-4842-1925-6_1)


contains supplementary material, which is available to authorized users.

© Sudipta Mukherjee 2016 1


S. Mukherjee, Source Code Analytics With Roslyn and JavaScript Data Visualization,
DOI 10.1007/978-1-4842-1925-6_1
Chapter 1 ■ Meet Roslyn Syntax API

Figure 1-1. Showing how GetRoot() is called along with signature

DescendantNodes
This method fetches all the child nodes of the root nodes. These nodes are all syntax nodes and not the trivia
nodes. Figure 1-2 shows how this method is used.

Figure 1-2. Showing how DescendantNodes() is called along with signature

DescendantTrivia
This method fetches all the trivia nodes of the current node on which this method is called. These nodes
are all trivia nodes. Trivia is ignored by the compiler but can be really useful for analyzing source code.
Figure 1-3 shows how this method can be used.

Figure 1-3. Showing usage of DescendantTrivia() method

DescendantTokens
This method gets all the descendant tokens of the current node. These tokens also include the trivia nodes.
Figure 1-4) shows how this method can be used.

2
Chapter 1 ■ Meet Roslyn Syntax API

Figure 1-4. Showing usage of the DescendantTokens() method

Ancestors
This method gets all the ancestors of the current node. This method is useful to go back to find the parent
node of a given kind of a node in question. For example, Figure 1-5 shows how this method can be used to
find all the ancestors of the first method declaration found in the given source code in the variable code.

Figure 1-5. Showing usage of Ancestors() method to locate parents of interest

Important Types
Now that you are well equipped with several useful SyntaxTree methods it is about time that you learn about
some of the important types in the framework. Knowledge about these types will be crucial to following
along the example for the rest of the book. This list is by no means comprehensive, but it will get you started
so that you can write your analyzers and follow along with the examples in the rest of the book.

MethodDeclarationSyntax
This type represents the method of a class/type.
• Arity: The number of generic types on which the method is described.
• AttributeLists: List of attributes applied on the method.
• Body: Body.Statements gives all the statements described in the method.
• ConstraintClauses: Constraints on the generic types of the method.

3
Chapter 1 ■ Meet Roslyn Syntax API

• ExplicitInterfaceSpecifier: Check to see if this method is an explicit interface


specifier or not.
• Identifier: Name of the method is stored in this variable.
• Modifiers: Represents list of modifiers (public/private/protected/static) of the
method.
• ParameterList: This property represents the list of parameters that are taken by the
method.
• TypeParameterList: If the Arity of a method is more than zero, then this list will
have all the details about those parameters.
Figure 1-6 puts these attributes of MethodDeclarationSyntax in perspective. Reconciling this figure
with the definitions of these fields just given, you see how these are mapped. As mentioned earlier, naming
in Roslyn may sound little bit off if you don't have a formal introduction to compiler design. It may be
difficult to mentally map the name Identifier to the name of the method. However, that’s how it is
designed. The name of everything is wrapped into the attribute of a class called Identifier. The name of a
class will be thus available inside the Identifier of ClassDeclarationSyntax type instance.

Figure 1-6. Annotated method body with different parts

ClassDeclarationSyntax
This type represents the class declarations in source code.
• Arity: Arity is the number of generic types on which the class is described.
• AttributeLists: List of attributes applied on the class.
• BaseList: This property represents the list of base classes and interfaces that this
type inherits from or implements.
• ConstraintClauses: This property represents the constraint clauses to be attributed
on this type.
• Identifier: This property holds the name of this type. This is universal across
Roslyn. The identifier property of any type holds the name (if applicable) for that
particular type.

4
Chapter 1 ■ Meet Roslyn Syntax API

• Members: This property represents all the members of the class.


• Modifiers: Represents list of modifiers (public/private/protected/static) of the class.
Figure 1-7 puts all these properties in perspective.

Figure 1-7. Annotated class with different parts

SructDeclarationSyntax
This type represents a structure declaration node in the given source code. This type has similar properties
like that of ClassDeclarationSyntax, but their meaning remains same in the context for a struct. So in
Figure 1-7, if you replace the class with a struct, all the other parts make sense for structure declaration.

InterfaceDeclarationSyntax
This type represents an interface declaration node in the given source code. This type has similar properties
like that of ClassDeclarationSyntax, but their meaning remains same in the context for a struct. So in
Figure 1-7, if you replace the class with an interface, all the other parts make sense for interface declaration.

IndexerDeclarationSyntax
This type represents an indexer defined in a type.
• AccessorList: This property represents all the accessors of the indexer.
• AttributeLists: This property represents all the attributes of the indexer.
• ExplicitInterfaceSpecifier: This property returns true if the indexer is marked
explicitly as an interface specfier.
• Modifiers: Represents list of modifiers (public/private/protected/static) of the
indexer.

5
Chapter 1 ■ Meet Roslyn Syntax API

• ParameterList: Represents list of parameters taken by the indexer.


• Type: Represents the return type of the indexer.
Figure 1-8 shows these properties for a sample indexer definition.

Figure 1-8. Showing parts of an annotated indexer

PropertyDeclarationSyntax
This type represents property declarations in class/type definitions. This is very similar to
IndexerDeclarationSyntax, but it doesn't have the ParameterList because properties don’t accept any
parameter—meaning for all other properties of this type, is similar to that of IndexerDeclarationSyntax.
Figure 1-9 shows parts of annotated property declaration syntax.

Figure 1-9. Showing parts of an annotated propery declaration

6
Chapter 1 ■ Meet Roslyn Syntax API

ForStatementSyntax
This type represents the for loop syntax.
• Condition: Represents the condition to terminate the loop.
• Declaration: This represents the variable declarations inside the loop. Sometimes
looping variables are declared inside the loop and initialized.
• Incrementors: This represents the part of the loop that increments or decremenets
the value of the looping variables.
• Initializers: This represents the part of the loop that initializes the looping
variables.
• Statement: This represents the actual body of the loop.
Figure 1-10 shows part of an annotated for loop.

Figure 1-10. Showing parts of an annotated for loop

When the declarations are done before the loop begins, then the value for Declaration becomes null
and all values are made avaialble inside Initializers, as shown in Figure 1-11.

Figure 1-11. Showing parts of an annotated for loop where loop variables are declared outside of the loop

ConstructorDeclarationSyntax
This represents constructors of a class.
• AttributeLists: List of attributes on this particular instance of constructor.
• Body: This represents the actual body of the constructor.
• Modifiers: This represents the modifiers (public, private, and so on) of the
constructor.
• ParameterList: List of parameters taken by this specific constructor.

7
Chapter 1 ■ Meet Roslyn Syntax API

Figure 1-12 shows parts of an annotated constructor definition.

Figure 1-12. Showing parts of an annotated constructor

ForEachStatementSyntax
This type represents the foreach statements.
• Expression: This represents the expression over which the enumeration has to be
performed by the foreach loop.
• Identifier: This holds the name of the looping varible.
• Statement: This represents the actual body of the loop.
• Type: This holds the type of the looping variable.
Figure 1-13 shows the annotated foreach statement syntax.

Figure 1-13. Showing parts of foreach loop

SwitchStatementSyntax
This type represents switch statements or switch blocks.
• Expression: This represents the expression on which the switching has to happen.
• Sections: This property represents actual sections of a switch block
Figure 1-14 shows parts of a switch block.

8
Chapter 1 ■ Meet Roslyn Syntax API

Figure 1-14. Showing parts of a switch statement

ParameterSyntax
In some of the previous types you have seen a property called ParameterList. This is nothing but a list of
all parameters expressed as ParameterSyntax. If we want to find details about any individual parameter, we
need to use this type.
• Default: This represents whether the parameter is default or not.
• Identifier: This holds the given name of the parameter.
• Type: The type of the parameter.
Figure 1-15 shows an annotated parameter list for a method.

Figure 1-15. Showing parameter details for a method

DoStatementSyntax
This type represents the do loop syntax.
• Condition: This represents the condition of the loop based on which it has to
terminate.
• Statement: This represents the statement of the loop—in other words, the body of
the loop.

9
Chapter 1 ■ Meet Roslyn Syntax API

Figure 1-16 shows an annotated do loop.

Figure 1-16. Showing annotated do loop

UsingStatementSyntax
This type represents the using blocks. If a type that implements IDisposable interface is wrapped inside
a using block, then the garbage collection happens automatically on exit of the using block. This is a very
common pattern in .NET code.
• Declaration: This represents the variable declaration inside the using block where
the type that implements the IDisposable interface is instantiated.
• Expression: This represents the expression of creating the IDisposable instance
inside the using block. The variable can be created either by a straight constructor
or by a factory method or such. If it is created by a straight constructor, then this
property is left null.
• Statement: This represents the actual code inside the using block.
Figure 1-17 shows annotated using block.

Figure 1-17. Showing annotated using statement block

10
Chapter 1 ■ Meet Roslyn Syntax API

IfStatementSyntax
This type represents the if statement syntax.
• Condition: This holds the condition of the if statement.
• Else: This represents an alternate path should the condition evaluate to false.
• Statement: This represents the actual code inside the if block.
Figure 1-18 shows an annoated if block.

Figure 1-18. Showing annotated if statement

TryStatementSyntax
This type represents the try-catch-finally blocks.
• Block: This represents the code that is wrapped inside the try block
• Catches: This represents the list of catch blocks.
• Finally: This represents the finally block.
Figure 1-19 shows the try-catch-finally block.

11
Random documents with unrelated
content Scribd suggests to you:
que celui-ci ne mène à mal Brandimart, car le païen a l’avantage des
armes, de l’épée, du destrier et d’une plus grande vigueur.
L’intrépide Brandimart, monté sur Frontin, cet excellent destrier
qui appartenait auparavant à Roger, se comporte si bravement, que
le Sarrasin ne paraît pas avoir encore trop d’avantage sur lui. S’il
avait un haubert d’aussi fine trempe que celui du païen, l’avantage
serait même en sa faveur. Mais, se sachant mal armé, il est obligé de
voltiger de droite et de gauche pour se défendre.
Frontin n’a pas son égal pour comprendre et exécuter les
volontés de son cavalier ; il semble qu’il devine, selon que Durandal
retombe, de quel côté il doit tourner afin de l’éviter. Agramant et
Olivier se livrent d’autre part une terrible bataille, et montrent des
qualités égales comme adresse et comme force.
Comme je viens de le dire, Roland laisse Sobrin à terre, et, pour
venir en aide à Brandimart, il s’avance à grands pas, étant à pied,
contre le roi Gradasse. Au moment où il va l’attaquer, il voit passer
sur le champ de bataille le bon cheval que montait Sobrin quand il a
été désarçonné. Roland s’empresse de courir après lui.
Il rattrape le destrier qui ne fait aucune résistance, et, d’un saut,
il se trouve en selle. D’une main il tient son épée levée, de l’autre il
prend la belle et riche bride. Gradasse aperçoit Roland ; il n’est
nullement effrayé de le voir venir sur lui, et il l’appelle par son nom.
Il espère le plonger dans la nuit éternelle, lui, Brandimart et leur
autre compagnon, avant que le soir soit encore venu.
Il laisse Brandimart, et, se tournant vers le comte, il lui porte un
coup de pointe au gorgerin. L’épée transperce tout, hormis la chair
du comte qu’aucun effort ne peut parvenir à entamer. Au même
instant, Roland laisse retomber Balisarde. Là où elle frappe, nul
enchantement ne prévaut ; casque, écu, haubert, harnais, elle fend
tout ce qu’elle touche.
Elle blesse au visage, à la poitrine, à la cuisse, le roi de Séricane,
dont le sang n’avait encore jamais coulé depuis qu’il avait endossé
pour la première fois les armes de chevalier. Gradasse trouve
étrange que cette épée, qui n’est pourtant pas Durandal, l’ait ainsi
blessé. Il en éprouve de l’angoisse et du dépit. Il comprend que si le
coup avait été plus avant, il aurait été fendu depuis la tête jusqu’au
ventre.
Après l’expérience qu’il vient de faire, il n’a plus la même
confiance qu’il avait eue jusque-là dans ses armes. Aussi procède-t-il
avec un redoublement d’attention et de prudence. Brandimart,
voyant que Roland est venu lui enlever le combat des mains, se
place au milieu du champ de bataille, afin de se porter là où il sera
besoin.
Le combat en est là, lorsque Sobrin, après être resté longtemps
étendu sur le sol, revient à lui, souffrant beaucoup de la tête et de
l’épaule. Il lève les yeux et regarde de tous côtés. Apercevant son
maître, il se hâte de lui venir en aide, se dissimulant de façon à ne
pas être vu.
Il s’approche d’Olivier qui, les yeux fixés sur Agramant, ne faisait
pas attention à autre chose, et, le prenant par derrière, il frappe son
destrier aux jarrets d’un coup qui force la malheureuse bête à
trébucher. Olivier tombe, mais il ne peut se relever, car, dans cette
chute inattendue, son pied gauche s’est trouvé pris sous son cheval.
Sobrin lui porte un second coup du revers de son épée. Il croit lui
faire sauter la tête, mais il est arrêté par l’armure faite d’un acier
trempé jadis par Vulcain, et qui a été portée autrefois par Hector.
Brandimart voit le péril, et court à toute bride sur le roi Sobrin. Il le
frappe à la tête et le renverse ; mais le fier vieillard se relève sur-le-
champ,
Et retourne à Olivier, afin de l’expédier pour l’autre monde, ou du
moins pour l’empêcher de se dégager de dessous son cheval. Olivier
a son meilleur bras libre, de sorte qu’il peut se défendre avec son
épée. Il la fait tournoyer avec une telle vigueur, qu’il tient Sobrin à
distance.
Il espère, s’il réussit à le maintenir en respect, avoir ainsi le
temps de se dégager. Il voit du reste son adversaire couvert de sang
dont il arrose le sable, et si faible qu’il se soutient à peine et ne peut
tarder à être vaincu. Olivier fait de nombreux efforts pour se
dégager de dessous son destrier, sans pouvoir y parvenir.
Brandimart est allé vers le roi Agramant, et a commencé à faire
pleuvoir autour de lui une tempête de coups. Monté sur Frontin, il
est tantôt sur les flancs, tantôt en face de son adversaire. Frontin
tourne comme la roue d’un tour. Mais si le fils de Monodant a un bon
cheval, le roi du Midi n’en a pas un moins bon, car il est monté sur
Bride-d’Or, que lui a donné Roger après l’avoir enlevé au fier
Mandricard.
Agramant a déjà un grand avantage grâce à son armure à toute
épreuve et d’une perfection sans égale. Brandimart, au contraire, a
pris la sienne au hasard, et comme il a pu la trouver dans un besoin
si pressant. Mais son ardeur le rend tellement sûr de lui-même, qu’il
ne doute pas d’avoir avant peu à la changer pour une meilleure. Bien
que le roi africain lui ait mis toute l’épaule droite en sang,
Et qu’il garde au flanc une blessure grave faite par Gradasse, le
guerrier de France trouve moyen d’atteindre son adversaire d’un
coup d’épée. Il brise son écu, lui blesse le bras gauche, et l’atteint,
mais légèrement, à la main droite. Mais tout cela n’est qu’un jeu,
qu’une plaisanterie auprès de ce qui se passe entre Roland et le roi
Gradasse.
Gradasse a à moitié désarmé Roland. Il lui a brisé son casque en
deux morceaux ; il lui a fait rouler son écu sur le sol, et a entr’ouvert
son haubert et sa cotte de mailles. Mais il n’a pu le blesser encore,
car Roland est fée. Le paladin, au contraire, a mis Gradasse dans un
état pitoyable ; outre la blessure dont j’ai déjà parlé, il lui en a fait
d’autres au visage, à la gorge, en pleine poitrine.
Gradasse est désespéré de se voir tout couvert de son propre
sang, tandis que Roland, après avoir reçu tant de coups, est intact,
de la tête aux pieds. Il lève son épée à deux mains, et il croit bien,
cette fois, lui fendre la tête, la poitrine, le ventre et tout le reste. Il
frappe le comte au front, juste à l’endroit où il a voulu l’atteindre.
Tout autre que Roland aurait été fendu en deux jusqu’à la selle.
Mais comme si Gradasse n’avait frappé que du plat de son épée,
celle-ci rebondit, aussi luisante, aussi nette qu’avant. Roland, étourdi
sous le coup, en vit, quoique forcé de regarder la terre, mille étoiles.
Il lâcha la bride, et aurait laissé tomber son épée, si elle n’avait été
attachée à son bras par une chaîne.
Le cheval qui portait Roland sur son dos fut tellement épouvanté
du bruit que produisit l’horrible coup, qu’il se mit à fuir sur l’arène
poudreuse, montrant combien il était bon à la course. Le comte,
ayant perdu connaissance par suite de la commotion qu’il a
éprouvée, n’a pas la force de le retenir. Gradasse le poursuit, et il
l’aurait bientôt rejoint pour peu qu’il eût pressé Bayard.
Mais, en regardant autour de lui, il voit le roi Agramant dans le
plus extrême péril. Le fils de Monodant l’a saisi par le casque avec
son bras gauche, le lui a délacé par devant, et cherche à le frapper à
la gorge avec son poignard. Le roi ne peut se défendre, car
Brandimart lui a également enlevé son épée.
Gradasse fait volte-face, et ne pense plus à poursuivre Roland. Il
accourt vers l’endroit où il voit le roi Agramant. L’imprudent
Brandimart, ne pensant pas que Roland ait laissé échapper
Gradasse, n’a d’autre préoccupation, d’autre pensée que de plonger
son poignard dans la gorge du païen. Soudain Gradasse arrive sur lui
et, prenant son épée à deux mains, lui en porte de toute sa force un
coup sur le casque.
Père du ciel, fais parmi tes élus une place au martyr de ta foi.
Arrivé à la fin de son tempétueux voyage, qu’il puisse désormais
replier sa voile dans le port. Ah ! Durandal, peux-tu être assez
infidèle à ton maître Roland, pour tuer ainsi sous ses yeux le
compagnon le plus cher, le plus dévoué qu’il ait au monde ?
Un cercle de fer, épais de deux doigts, entourait le casque de
Brandimart ; il fut partagé et rompu par le coup terrible, ainsi que la
coiffe d’acier qui était par-dessous. Brandimart, la face toute pâle,
tombe de cheval ; un énorme jet de sang s’échappe de sa tête, et se
répand comme un fleuve sur le sable.
Le comte, ayant repris ses sens, jette les yeux autour de lui et
aperçoit son cher Brandimart étendu par terre ; il voit, au maintien
du Sérican, quel est celui qui lui a donné la mort. Je ne saurais dire
quel sentiment l’emporta en lui, de la douleur ou de la colère. Mais il
avait si peu de temps pour pleurer, qu’il fit taire sa douleur pour
laisser sortir sa colère. Mais il est temps que je mette fin à ce chant.
CHANT XLII.

Argument. — Le combat de Lampéduse se termine par la mort de


Gradasse et d’Agramant, occis par la main de Roland, qui accorde
la vie à Sobrin. — Bradamante se désole du retard de Roger. —
Renaud, en allant sur les traces d’Angélique, trouve un remède
qui le guérit de son amoureuse passion. S’étant remis en chemin
pour rejoindre Roland, il fait la rencontre d’un chevalier qui le
reçoit dans un magnifique palais orné de statues représentant
diverses dames de la maison d’Este. Son hôte lui propose un
moyen de s’assurer de la fidélité de sa femme.

Quel frein assez dur, quel nœud de fer, quelle chaîne de diamant,
s’il peut en exister, feraient que la colère se pourrait contenir dans
de justes bornes et ne dépassât point la mesure, quand on voit celui
pour lequel Amour vous a mis au cœur une solide affection, frappé
par ruse ou par violence de déshonneur ou d’un coup mortel ?
Et si l’âme devient alors cruelle et inhumaine, il faut l’excuser, car
la raison n’a plus de prise sur elle. Achille, après avoir vu Patrocle,
sous les armes qu’il lui avait prêtées, rougir la terre de son sang, ne
put assouvir sa colère en tuant son meurtrier ; il fallut encore qu’il le
traînât derrière son char et lui fît mille outrages.
Invincible Alphonse, c’est une colère pareille qui enflamma vos
soldats, le jour où vous fûtes si gravement blessé au front d’un coup
de pierre, que chacun crut votre âme partie pour l’autre monde ; leur
fureur fut telle, que retranchements, murailles ou fossés, rien ne put
protéger les ennemis contre leur élan, et qu’ils ne s’arrêtèrent
qu’après les avoir tous massacrés, sans en laisser un seul vivant
pour porter la nouvelle.
C’est en vous voyant tomber, que les vôtres entrèrent dans une
telle fureur, et se livrèrent à de telles cruautés. Si vous aviez été
debout, vous auriez certainement modéré leur soif de carnage. Cela
vous suffisait en effet d’avoir repris la Bastia en quelques heures,
alors que les gens de Grenade et de Cordoue avaient dû employer
plusieurs jours pour vous l’enlever.
Peut-être fut-ce une vengeance permise par Dieu, que vous vous
soyiez trouvé en pareil état, afin que les ennemis fussent ainsi punis
des épouvantables excès auxquels ils s’étaient livrés quelque temps
auparavant. Le malheureux Vestidel, las et blessé, s’étant rendu leur
prisonnier, fut frappé, alors qu’il était sans armes, et tué de plus de
cent coups d’épée par ces forcenés, dont la plupart étaient
mahométans.
Mais, pour conclure, je dis qu’il n’y a pas de colère comparable à
celle qu’on éprouve quand on voit outrager sous ses yeux un parent
ou un vieil ami. Il était donc tout naturel qu’une colère soudaine
envahît le cœur de Roland, lorsqu’il vit un ami si cher étendu
mourant, par suite de l’horrible coup que lui avait porté le roi
Gradasse.
De même que le pasteur nomade, qui a vu s’enfuir en sifflant
l’horrible serpent dont la dent venimeuse a causé la mort de son
enfant qui jouait sur le sable, saisit son bâton avec colère et avec
rage, ainsi le chevalier d’Anglante, plein de fureur, saisit l’épée au
tranchant sans pareil. Le premier qu’il rencontra fut le roi Agramant,
Qui, tout ensanglanté, sans épée, avec une moitié d’écu, le
casque délacé, et blessé en plus d’endroits que je ne puis dire,
s’était tiré des mains de Brandimart, comme un épervier imprudent
qui se serait attaqué à un vautour par voracité ou par étourderie.
Roland arrive sur lui, et lui porte un coup juste à l’endroit où la tête
s’attache au buste.
Agramant avait son casque brisé, et le cou désarmé, de sorte que
Roland le lui coupe net comme si c’eût été un jonc. La tête du roi de
Lybie tombe, et son corps roule lourdement sur le sable. Son âme
prend sa course vers les ondes infernales, où Caron l’attire avec son
croc dans sa barque. Roland ne s’attarde pas à le frapper une
seconde fois ; il court au Sérican avec Balisarde.
Gradasse en voyant tomber Agramant, la tête séparée du buste,
éprouve ce qu’il n’a jamais ressenti ; son cœur tremble ; son visage
pâlit. Lorsque le chevalier d’Anglante arrive sur lui, il semble
présager son sort, et, vaincu d’avance, il n’a pas encore songé à se
mettre en défense quand le coup mortel descend sur lui.
Roland le frappe au flanc droit, sous la dernière côte ; le fer, entré
par le ventre, ressort d’une palme du côté gauche, ruisselant de
sang jusqu’à la garde. C’est de la main du plus franc et du meilleur
guerrier de l’univers que fut porté le coup qui mit à mort le chevalier
le plus redoutable de tous les païens.
Le paladin, peu joyeux d’une telle victoire, se jette promptement
à bas de selle, et, le visage troublé et plein de larmes, il court en
toute hâte à son cher Brandimart. Il voit tout autour de lui la terre
couverte de sang. Son casque, qui semble ouvert d’un coup de
hache, ne l’avait pas plus protégé que s’il eût été d’écorce.
Roland relève sa visière, et voit qu’il a la tête fendue jusqu’au
nez, juste entre les deux sourcils. Cependant Brandimart a conservé
assez de souffle pour demander pardon de ses fautes au roi du
Paradis, pour consoler le comte dont les joues sont sillonnées de
larmes, et l’exhorter à la patience.
Il lui dit : « — Roland, souviens-toi de moi dans tes prières qui
sont agréables à Dieu. Je te recommande ma Fleur-de… — » Mais il
ne peut en dire davantage ; il meurt sans achever le mot. Des voix
d’anges, s’unissant en chœurs célestes, s’entendirent soudain dans
les airs, dès qu’il eut exhalé son âme ; et celle-ci, dégagée de ses
liens corporels, s’éleva vers le ciel au milieu d’une douce mélodie.
Roland, bien qu’il dût se réjouir d’une fin si chrétienne, et bien
qu’il sût que Brandimart était monté aux demeures bienheureuses,
car il avait vu le ciel s’ouvrir pour lui, ne pouvait cependant maîtriser
sa nature humaine et ses sens fragiles. En songeant qu’il venait de
se voir enlever celui qui était pour lui plus qu’un frère, il ne pouvait
empêcher les larmes d’humecter son visage.
Sobrin gisait depuis longtemps à terre, perdant beaucoup de
sang qui découlait de sa tête sur ses joues et sur sa poitrine. Il ne
devait plus guère en rester dans ses veines. Quant à Olivier, il était
encore renversé sous son cheval, et n’avait pu dégager son pied que
le poids du destrier avait à moitié brisé.
Et si son beau-frère, gémissant et tout en larmes, n’était pas
venu l’aider, il n’aurait pu se dégager de lui-même. Son pied lui
faisait tellement mal, qu’une fois qu’il l’eut retiré de dessous son
cheval, il ne put ni s’en servir, ni même s’appuyer dessus. Sa jambe
elle-même était si engourdie, qu’il lui fallut se faire aider pour
pouvoir changer de place.
Roland se réjouit peu de la victoire ; il lui était trop dur, trop cruel
de voir Brandimart mort et son beau-frère dans un état si peu
rassurant. Sobrin était encore vivant, mais c’est à peine s’il lui restait
quelque souffle, car sa vie était prête à s’exhaler avec la dernière
goutte de son sang.
Le comte le fit enlever tout sanglant du champ de bataille, et le
fit soigner avec beaucoup de soin ; il le consolait par de douces
paroles, comme s’il eût été de sa famille ; car, après le combat, il ne
gardait aucune trace de colère, et son cœur était tout à la clémence.
Il fit ramasser les armes et les chevaux des morts, et laissa le reste
aux serviteurs.
Ici, je dois avouer que Frédéric Fulgose doute quelque peu de la
véracité de mon histoire, car, ayant visité avec sa flotte les moindres
recoins du rivage barbaresque, il descendit sur l’île où eut lieu le
combat des six chevaliers, et en trouva le sol si montueux, si inégal,
qu’il n’y a pas, dit-il, un seul endroit où l’on puisse mettre le pied à
plat.
Il ne peut tenir pour vraisemblable que, sur cet écueil accidenté,
six chevaliers, la fleur du monde entier, aient pu se livrer cette
bataille à cheval. Je réponds à cette objection qu’au temps de
Roland il y avait, sur la droite, une plaine assez vaste, qui depuis fut
recouverte par suite de l’éboulement d’un immense rocher, détaché
de sa base lors d’un tremblement de terre.
C’est pourquoi, ô splendeur éclatante de la race des Fulgoses, ô
lumière sereine et toujours plus vivace, si vous me prenez encore à
partie sur ce point, et surtout devant cet invincible duc, grâce auquel
votre patrie jouit maintenant d’un doux repos et voit l’amour
succéder pour elle à la haine, je vous prie de lui dire sans retard qu’il
se peut fort bien qu’en cette circonstance je n’aie point dit un
mensonge.
Cependant Roland, ayant tourné ses regards vers la mer, aperçut
un navire léger qui venait à toutes voiles et paraissait vouloir
aborder à l’île. Quel était ce navire ? Je ne veux pas vous le dire
maintenant, parce que je suis attendu en plus d’un autre endroit.
Pour le moment, voyons en France si les habitants, délivrés enfin des
Sarrasins, sont chagrins ou joyeux.
Voyons ce que fait cette amante fidèle, qui voit de nouveau
s’éloigner l’accomplissement de ses vœux ; je veux parler de la
malheureuse Bradamante. Quand elle voit que Roger a encore
manqué au serment qu’il a fait quelques jours avant le conflit
survenu entre les deux armées, elle ne sait plus sur quoi placer son
espérance.
Elle renouvelle ses pleurs et ses reproches, et, selon son
habitude, elle recommence à appeler Roger cruel, et à traiter le
destin d’impitoyable. Puis, déployant les voiles à sa grande douleur,
elle accuse d’injustice, de complicité ou de faiblesse le ciel qui a
permis un tel parjure, et qui n’a pas même fait un signe pour
l’empêcher.
Elle en arrive à accuser Mélisse et à maudire l’oracle de la grotte
qui, par ses conseils mensongers, l’a précipitée dans la mer d’amour
où elle est sur le point de mourir. Puis elle va trouver Marphise, et se
plaindre à elle de son frère qui a manqué à sa foi jurée. Elle soulage
sa douleur en criant, en pleurant auprès d’elle, et lui demande aide
et appui.
Marphise la serre dans ses bras, et fait ce qu’elle peut pour la
consoler. Elle ne croit pas que Roger ait failli à ce point ; elle pense
qu’il ne tardera pas à revenir auprès d’elle. Elle lui jure, s’il ne
revient pas, qu’elle ne souffrira pas une si grave offense, et qu’elle
se battra avec lui, ou lui fera observer sa promesse.
Par ces paroles, elle réussit à adoucir un peu la douleur de
Bradamante qui, ayant quelqu’un pour s’épancher désormais,
éprouve une angoisse moindre. Maintenant que nous avons vu
Bradamante accuser dans son chagrin Roger de parjure, de cruauté
et d’orgueil, voyons si son frère est plus heureux ; je veux parler de
Renaud qui est brûlé jusqu’à la moelle des feux de l’amour.
Je veux parler de Renaud qui, comme vous le savez, aimait si
passionnément la belle Angélique. C’était un enchantement, encore
plus que la beauté de cette dernière, qui l’avait fait tomber ainsi
dans les rets de l’amour. Les autres paladins vivaient en repos,
depuis qu’ils étaient complètement débarrassés des Maures ; lui seul,
parmi les vainqueurs, était resté captif de son amoureuse peine.
Il avait envoyé de côtés et d’autres plus de cent messagers pour
s’enquérir de ce qu’elle était devenue ; lui-même l’avait cherchée
longtemps. Enfin il était allé trouver Maugis qui l’aidait toujours dans
les cas embarrassants. Le visage rouge de honte et les yeux baissés,
il se décida à lui avouer son amour. Puis il le pria de lui enseigner où
se trouvait Angélique si désirée par lui.
Maugis éprouve un grand étonnement d’un cas si étrange. Il sait
que, seul entre ses rivaux, Renaud a eu jadis l’occasion de tenir plus
de cent fois Angélique dans son lit, et lui-même, persuadé de cette
vérité, avait fait tout ce qu’il avait pu, par ses prières et par ses
menaces, pour le pousser à ce résultat, sans avoir pu jamais l’y
amener.
Il l’avait d’autant plus vivement poussé dans cette voie, qu’en
écoutant ses conseils, Renaud aurait alors retiré Maugis de prison. Et
voilà que maintenant que l’occasion est manquée, et que rien ne
peut plus lui venir en aide, Renaud demande de lui-même ce qu’il a
jadis refusé plus que de raison ; voilà qu’il vient le prier, lui Maugis,
alors qu’il doit se rappeler qu’il a failli causer sa mort en une obscure
prison par ses refus d’autrefois !
Mais plus les sollicitations de Renaud paraissent importunes à
Maugis, plus ce dernier reconnaît manifestement combien son amour
est grand. Les prières de Renaud le touchent enfin ; il noie dans
l’océan de sa mémoire le ressentiment de l’offense ancienne, et
s’apprête à lui venir en aide.
Il met fin à ses obsessions, et lui rend l’espoir en lui disant qu’il
lui sera favorable, et qu’il saura lui dire quelle route suit Angélique,
qu’elle soit en France ou ailleurs. Aussitôt Maugis se rend à l’endroit
où il a l’habitude de conjurer les démons. C’est une grotte située au
sein de monts inaccessibles. Il ouvre son livre, et appelle la foule des
esprits infernaux.
Puis il en choisit un fort instruit sur tous les cas amoureux, et il
veut savoir de lui comment il se fait que Renaud, qui jadis avait le
cœur si dur, l’a maintenant si sensible. Alors il apprend l’histoire de
ces deux sources, dont l’une attise le feu, tandis que l’autre l’éteint ;
il apprend que le mal causé par l’une des deux ne peut être guéri
par rien, si ce n’est par l’eau de l’autre.
Il apprend aussi comment Renaud, ayant bu d’abord à celle des
deux sources qui chasse l’amour, se montra si obstinément rebelle
aux longues prières d’Angélique la belle ; mais ayant été plus tard
amené par sa mauvaise étoile à boire à l’autre source qui donne
l’amoureuse ardeur, Renaud se mit à aimer celle qui jusque-là lui
avait déplu au delà de toute raison.
Il fut vraiment poussé par sa mauvaise étoile et le destin cruel à
boire la flamme dans cette source glacée ; car, presque au même
moment, Angélique s’en vint boire à l’autre source qui rendit son
cœur si inaccessible à l’amour, que, depuis, elle se mit à fuir Renaud
comme un serpent. Quant à Renaud, il l’aimait, et l’amour était aussi
fort chez lui que la haine et le dédain chez elle.
Quand le démon eut pleinement instruit Maugis sur le cas
étrange de Renaud, il raconta avec non moins de détails
qu’Angélique s’était donnée tout entière à un jeune Africain, et
comment elle avait quitté l’Europe et s’était embarquée en Espagne,
sur les galères des hardis marins catalans, pour retourner dans
l’Inde.
Lorsque Renaud vint chercher la réponse de son cousin, Maugis
chercha fortement à le dissuader d’aimer plus longtemps Angélique.
Il lui dit qu’elle s’était livrée à un vil Barbare ; elle était à cette heure
si loin de France, qu’il aurait beaucoup de peine à retrouver ses
traces, car elle avait déjà fait plus de la moitié du chemin pour
arriver dans son pays, où elle retournait avec Médor.
Le départ d’Angélique n’aurait point semblé chose trop pénible à
l’intrépide amant, et n’aurait point troublé son sommeil, ni empêché
qu’il ne conçût l’idée de partir pour le Levant. Mais, en apprenant
qu’un Sarrasin avait cueilli les prémices de son amour, il éprouve une
telle souffrance, une telle angoisse, qu’en aucun autre moment de sa
vie il ne souffrit davantage.
Il lui est impossible de faire la moindre réponse. Son cœur, au
dedans, son cœur tremble ; au dehors, ses lèvres s’agitent
vainement ; sa langue ne peut articuler une parole. Sa bouche est
amère comme s’il avait avalé du poison. Il quitte soudain Maugis, et
après avoir poussé de grands soupirs, exhalé de grandes plaintes, il
se décide à partir pour le Levant où l’entraîne sa rage jalouse.
Il demande congé au fils de Pépin, et prend pour prétexte son
destrier Bayard qu’emmène le Sarrasin Gradasse, au mépris des
devoirs de tout vaillant chevalier. C’est le souci de son honneur qui le
pousse à courir après lui, afin qu’il empêche le Sérican menteur de
se vanter jamais d’avoir enlevé Bayard, par la lance ou l’épée, à un
paladin de France.
Charles lui donne licence de partir, bien qu’il en soit triste, ainsi
que toute la France. Mais il ne peut lui refuser cette faveur, tant son
désir lui paraît honorable. Dudon et Guidon veulent accompagner
Renaud, mais celui-ci repousse l’offre de l’un et de l’autre. Il quitte
Paris et s’en va seul, plein de soupirs et d’amoureux soucis.
Il a sans cesse à la mémoire, et cette pensée ne peut s’ôter de
son esprit, qu’il a pu mille fois posséder Angélique, et qu’il a toujours
obstinément, follement repoussé une si rare beauté. Mais le temps
où il pouvait avoir un tel plaisir, et où il n’a pas voulu, ce bon temps
est perdu, et maintenant il consentirait à la posséder un seul jour,
sauf à mourir après.
Il se demande sans cesse — et il ne peut songer à autre chose —
comment il a pu se faire qu’un pauvre soldat ait soumis son cœur,
rebelle aux mérites et à l’amour de tant d’illustres amants. C’est avec
une telle pensée, qui lui ronge le cœur, que Renaud s’en va vers le
Levant. Il suit la route qui mène droit au Rhin et à Bâle, jusqu’à ce
qu’il ait atteint la grande forêt des Ardennes.
Le paladin avait fait plusieurs milles dans l’intérieur de la forêt
aventureuse, loin de tout village et de tout castel, et il était arrivé
dans un endroit sauvage et plein de dangers, lorsqu’il vit soudain le
ciel se troubler, et le soleil disparaître derrière une masse de nuages.
Au même moment s’élançait d’une caverne obscure un monstre
étrange ayant la figure d’une femme.
Sa tête avait mille yeux sans paupières ; il ne pouvait les clore et
par conséquent je crois qu’il lui était impossible de dormir. Il avait
autant d’oreilles que d’yeux. Au lieu de cheveux, il avait sur la tête
une multitude de serpents. Ce spectre épouvantable était sorti des
ténèbres infernales pour se répandre sur le monde. Il avait pour
queue un féroce et immense serpent, qui roulait ses nœuds autour
de sa poitrine.
Ce qui n’était jamais arrivé à Renaud en mille et mille aventures
lui arriva là. Quand il vit le monstre s’apprêter à l’attaquer, et
s’élancer sur lui, une peur inconnue jusque-là pénétra dans ses
veines. Cependant il dissimula, résolu à montrer son audace
accoutumée. D’une main tremblante, il saisit son épée.
Le monstre s’apprête à lui donner un rude assaut, avec autant de
science que s’il était maître de guerre. Le serpent venimeux se
déroule en l’air, puis il s’élance contre Renaud, autour duquel il
multiplie, de çà de là, ses bonds énormes. Renaud cherche à s’en
défendre, mais c’est en vain qu’il prodigue ses coups à droite et à
gauche. Aucun d’eux n’atteint son adversaire.
Tantôt le monstre dirige sur la poitrine de Renaud son serpent
qui se glisse sous les armes du chevalier et le glace jusqu’au cœur ;
tantôt il le fait pénétrer par la visière et le promène sur le cou et sur
la figure de Renaud. Celui-ci finit par se débarrasser de cette
étreinte, et donne tant qu’il peut de l’éperon à son cheval. Mais
l’infernale Furie n’est pas boiteuse ; d’un bond elle le rattrape, et lui
saute en croupe.
Qu’il aille à gauche, à droite, où bon lui semble, Renaud a
toujours cette bête maudite acharnée après lui. Il ne sait comment
s’en débarrasser, bien que son destrier ne cesse de lancer des
ruades. Le cœur de Renaud tremble comme une feuille ; non pas
que le serpent le tourmente davantage, mais il éprouve une telle
horreur, un tel dégoût, qu’il crie, gémit, et se plaint de vivre encore.
Il se jette dans les sentiers les moins frayés, dans les chemins les
plus affreux, au plus épais du bois ; il gravit les pentes les plus
raides ; il s’enfonce dans les défilés les plus inextricables de la vallée,
là où l’air est le plus obscur. Il espère ainsi arracher de dessus ses
épaules l’abominable, l’horrible bête qui y est attachée. Il n’y serait
sans doute point parvenu, si quelqu’un n’était soudain arrivé à son
secours.
Mais il est secouru à temps par un chevalier couvert d’une
armure d’acier éclatante et splendide, et portant pour cimier un joug
rompu. Son écu jaune est semé de flammes ardentes, ainsi que le
reste de ses vêtements d’un caractère sévère, et la housse de son
cheval. Il a la lance au poing, l’épée au côté ; sa masse pendue à
l’arçon projette du feu.
Cette masse est remplie d’un feu éternel qui brûle toujours sans
la consumer jamais. La bonté d’un écu, la trempe d’une cuirasse,
l’épaisseur d’un casque, rien ne lui résiste. Le chevalier se fait
infailliblement faire place, partout où il en dirige l’inextinguible
lumière. Il ne lui fallait pas moins que cet avantage pour sauver
Renaud des mains du monstre cruel.
En chevalier avisé et prudent, il court au galop vers l’endroit où il
a entendu la rumeur, jusqu’à ce qu’il aperçoive le monstre horrible
qui a enlacé Renaud de mille nœuds, et qui couvre d’une sueur
glacée le malheureux paladin, sans que celui-ci puisse s’en
débarrasser. Le chevalier se précipite, frappe le monstre au flanc, et
le fait tomber du côté gauche.
Mais à peine l’horrible bête a-t-elle touché terre, qu’elle se
redresse, faisant tourner et siffler son long serpent. Le chevalier ne
cherche plus à la frapper avec la lance ; il se décide à la poursuivre
par le feu. Il saisit sa masse, et fait pleuvoir une tempête de coups
partout où le serpent dresse la tête. Il ne laisse pas le temps au
monstre de le saisir une seule fois.
Pendant qu’il le tient en échec, le frappe et lui fait mille
blessures, il conseille au paladin de s’échapper par le chemin qui
conduit au sommet de la montagne. Le paladin suit ce conseil, et
prend le chemin qui lui est indiqué, et bien que la colline soit âpre et
rude à escalader, il s’éloigne sans retourner la tête, jusqu’à ce qu’on
l’ait perdu de vue.
Le chevalier, après avoir contraint le monstre infernal de
retourner à son antre obscur, où il se ronge de rage et de dépit, et
où il verse des pleurs inépuisables par ses mille yeux, monte derrière
Renaud, afin de lui servir de guide. Il ne tarde pas à le rejoindre sur
le sommet de la colline et, marchant à ses côtés, il le conduit hors
de ces lieux sombres et dangereux.
Dès que Renaud le voit revenu près de lui, il lui dit qu’il lui doit
des remerciements infinis, et que partout où il sera, il peut disposer
de sa vie.
Puis il lui demande comment il se nomme, afin qu’il puisse
proclamer le nom de celui qui est venu à son secours, et exalter sa
vaillance parmi ses compagnons, devant Charles lui-même.
Le chevalier lui répond : « — Ne te mets pas en peine de ce que
je ne veux pas te dire mon nom maintenant. Je te le dirai avant que
l’ombre n’ait cru d’un pas, ce qui ne tardera guère. — » En
continuant à marcher côte à côte, ils finirent par trouver une source
fraîche, aux eaux claires, à laquelle les bergers et les voyageurs,
attirés par son doux murmure, venaient boire l’amoureux oubli.
C’étaient là, seigneur, ces eaux glacées qui éteignent le feu de
l’amoureuse ardeur. C’était après y avoir bu qu’Angélique avait conçu
pour Renaud la haine qu’elle ne cessa depuis de lui porter ; et si lui-
même avait autrefois montré tant de mépris pour elle, l’unique
cause, seigneur, en était qu’il avait bu aussi de ces mêmes eaux.
Dès que le chevalier avec lequel Renaud chemine se voit devant
la claire fontaine, il retient son destrier tout fumant et dit : « —
Nous reposer ici ne saurait nuire. — » Renaud dit : « — Cela ne
peut que nous faire du bien ; car, outre que la chaleur de midi
m’oppresse, le monstre m’a tellement travaillé, qu’il me sera doux et
agréable de me reposer. — »
L’un et l’autre descendent de cheval, et laissent leurs bêtes paître
en liberté par la forêt. Tous deux mettent pied à terre dans l’herbe
parsemée de fleurs rouges et jaunes, et retirent leur casque.
Renaud, poussé par la chaleur et la soif, court aussitôt vers la source
de cristal, et buvant à longs traits son eau fraîche, chasse en même
temps de sa poitrine embrasée la soif et l’amour.
Quand le chevalier le voit relever la bouche de dessus la fontaine,
et revenir entièrement guéri de son fol amour, il se lève tout debout,
et d’un air altier, il lui dit ce qu’il n’a pas voulu lui dire auparavant : «
— Sache, Renaud, que mon nom est : le Dédain ! Je suis venu
uniquement pour te délivrer d’un joug indigne. — »
A ces mots, il disparaît et son destrier disparaît avec lui. Cette
aventure semble un grand miracle à Renaud. Il cherche tout autour
de lui et dit : « — Où est-il passé ? — » Il ne sait si tout ce qu’il
vient de voir n’est pas du domaine de la magie, et si Maugis ne lui a
pas envoyé un de ses serviteurs infernaux pour rompre la chaîne qui
l’a si longtemps retenu captif.
Peut-être aussi, du haut de son trône, Dieu lui a-t-il, dans son
ineffable bonté, envoyé, comme il fit jadis pour Tobie, un ange
chargé de le guérir de son aveuglement. Mais que ce soit un ange,
un démon, ou toute autre chose, il le remercie de lui avoir rendu la
liberté. Il sent en effet que désormais son cœur est délivré de son
angoisse amoureuse.
Angélique est redevenue l’objet de sa haine première ; non
seulement elle ne lui paraît pas digne de tout le long chemin qu’il a
déjà fait pour la suivre, mais il ne ferait pas maintenant une demi-
lieue pour elle. Cependant il persiste dans sa résolution d’aller dans
l’Inde, pour chercher Bayard jusqu’en Séricane, tant parce que
l’honneur le lui commande, que parce que c’est le prétexte qu’il a
invoqué près de Charles.
Il arrive le jour suivant à Bâle, où venait de parvenir la nouvelle
que le comte Roland devait se battre contre Gradasse et le roi
Agramant. Ce n’était point par un avis du chevalier d’Anglante que
cette nouvelle avait été sue, mais un voyageur, venu rapidement de
Sicile, l’avait donnée comme sûre.
Renaud désire ardemment se trouver à côté de Roland dans ce
combat ; mais il est bien éloigné du champ de bataille. Tous les dix
milles, il change de chevaux et de guides, et court à bride abattue. Il
passe le Rhin à Constance, et, comme en volant, il traverse les Alpes
et arrive en Italie. Laissant derrière lui Vérone et Mantoue, il atteint
le Pô, et le passe en toute hâte.
Déjà le soleil touchait au terme de sa course, déjà la première
étoile apparaissait au ciel, et Renaud, debout près de la rive, se
demandait s’il devait changer de cheval, ou se reposer en ce lieu,
jusqu’à ce que les ténèbres se fussent dissipées devant la belle
aurore, lorsqu’il vit venir à lui un chevalier à l’aspect et aux manières
pleins de courtoisie.
Celui-ci, après l’avoir salué, lui demanda poliment s’il était marié.
Renaud lui dit : « — Je suis en effet soumis au joug conjugal. — »
Mais en lui-même il s’étonnait de cette demande, lorsque son
interlocuteur ajouta : « — Je me réjouis qu’il en soit ainsi. — » Puis,
pour lui expliquer ses paroles, il dit : « — Je te prie d’avoir pour
agréable d’accepter ce soir l’hospitalité chez moi.
« Je te ferai voir une chose que doit volontiers connaître
quiconque a femme à son côté. — » Renaud, autant parce qu’il
voulait se reposer, fatigué qu’il était d’avoir couru, autant par le désir
inné qu’il avait toujours eu de voir et d’entendre de nouvelles
aventures, accepta l’offre du chevalier, et le suivit.
Ils sortirent de la route à une portée d’arc, et se trouvèrent
devant un grand palais, d’où accoururent un grand nombre d’écuyers
avec des torches allumées, qui projetèrent autour d’eux une grande
clarté. Renaud, étant entré, jeta les regards autour de lui, et vit un
palais comme on en voit rarement, admirablement construit et
distribué, et trop vaste pour servir de demeure à un homme de
condition privée.
La riche voûte de la porte d’entrée était toute en serpentine et en
dur porphyre. La porte elle-même était en bronze, et ornée de
figures qui semblaient respirer et remuer les lèvres. On passait
ensuite sous un arc de triomphe, où un mélange de mosaïques
flattait agréablement les yeux. De là partait une cour carrée, dont
chaque côté avait cent brasses de long.
Chaque côté de cette cour était bordé de pavillons ayant chacun
une porte spéciale. Les portes étaient séparées par des arcades
d’égale grandeur, mais de formes variées. Chaque arcade pouvait
facilement donner accès à un sommier avec sa charge, et conduisait
à un escalier d’où l’on pénétrait dans une salle par une arcade
supérieure.
Les arcades supérieures dépassaient l’alignement général de
façon à recouvrir les portes. Chacune d’elles était soutenue par deux
colonnes, l’une de bronze, l’autre de roche. Il serait trop long de
vous faire une entière description des pavillons de la cour, et de vous
parler, en outre, de ce que l’on apercevait au-dessus du sol, des
souterrains que le maître de ce palais avait fait construire sous tous
les bâtiments.
Les hautes colonnes avec leurs chapiteaux en or incrustés de
pierreries ; les marbres étrangers sculptés de mille manières par une
main habile ; les peintures et les stucs, et une foule d’autres
ornements, dont la plupart étaient dérobés aux regards par
l’obscurité, indiquaient que les richesses réunies de deux rois
n’avaient pas dû suffire à bâtir un tel édifice.
Parmi les ornements magnifiques qui ornaient en profusion cette
riante demeure, il y avait une fontaine qui répandait ses eaux
fraîches et abondantes par une foule de petites rigoles. C’est là que
les serviteurs avaient dressé les tables, droit au milieu de la cour. On
l’apercevait des quatre portes du principal corps de bâtiment.
Élevée par un architecte instruit et habile, la fontaine avait la
forme d’une galerie ou d’un pavillon octogone, recouvert de tous
côtés par un plafond d’or tout parsemé d’émaux. Huit statues de
marbre blanc soutenaient ce plafond avec leurs bras.
L’ingénieux architecte leur avait mis dans la main droite la corne
d’Amalthée, d’où l’eau retombait, avec un agréable murmure, dans
un vase d’albâtre. Tous ces pilastres, sculptés avec le plus grand art,
représentaient de grandes femmes, différant d’habits et de visage,
mais ayant toutes la même grâce et la même beauté.
Chacune d’elles reposait les pieds sur deux belles figures situées
plus bas, et qui se tenaient la bouche ouverte, comme pour indiquer
qu’elles prenaient plaisir à chanter et à jouer. Leur attitude semblait
aussi indiquer que toute leur science, toute leur application était
destinée à célébrer les louanges des belles dames qu’elles portaient
sur leurs épaules.
Les statues inférieures tenaient à la main de longs et vastes
rouleaux couverts d’écriture, où était inscrit, avec de grands éloges,
le nom des plus illustres parmi les dames que représentaient les
statues supérieures, et où pouvaient se lire aussi leurs propres noms
en lettres brillantes. Renaud, à la lueur des torches, admirait une à
une les dames et les chevaliers.
La première inscription qui frappa ses yeux portait le nom
longuement honoré de Lucrèce Borgia, dont la beauté et l’honnêteté
étaient mises par Rome, sa patrie, bien au-dessus de celles de
l’antique Lucrèce. Les deux statues qu’on avait destinées à supporter
une si excellente et si honorable charge portaient écrits les noms de
Antonio Tebaldo et Hercule Strozza, un Linus et un Orphée.
La statue qui venait après était non moins belle et non moins
agréable à voir ; son inscription disait : Voici la fille d’Hercule,
Isabelle. Ferrare se montrera plus heureuse de l’avoir vue naître que
de tous les autres biens que la fortune favorable lui a accordés et lui
accordera pendant la suite des siècles.
Les deux statues qui se montraient désireuses de célébrer
constamment sa gloire avaient toutes deux le prénom de Jean-
Jacques ; l’un s’appelait Calandra, l’autre Bardelone. Dans le
troisième et le quatrième côté, où l’eau s’échappait hors du pavillon
par d’étroites rigoles, étaient deux dames ayant même patrie, même
famille, même réputation, même beauté et même valeur.
L’une s’appelait Élisabeth, l’autre Léonora. Ainsi que le racontait
l’écrit sculpté sur le marbre, la terre de Mantoue se glorifiera encore
plus de leur avoir donné naissance que d’avoir produit Virgile qui
l’honore tant. La première avait à ses pieds Jacopo Sadoleto et
Pietro Bembo.
L’autre était supportée par l’élégant Castiglione et le savant Muzio
Arelio. Ces noms, alors inconnus, aujourd’hui si fameux et si dignes
de louange, étaient sculptés sur le marbre. Après ces statues, venait
celle à qui le ciel doit accorder tant de vertus, qu’elle n’aura pas sa
pareille parmi les têtes couronnées, soit dans la bonne, soit dans la
mauvaise fortune.
L’inscription d’or la signalait comme étant Lucrèce Bentivoglia ;
parmi les éloges qui lui étaient donnés, on disait que le duc de
Ferrare se réjouissait et s’enorgueillissait d’être son père. Ses
louanges étaient célébrées d’une voix claire et douce par ce Camille,
dont le Reno et Felsina écoutent les chants [14] avec autant
d’admiration et de stupeur que jadis l’Amphrise en mettait à
entendre chanter son berger,
Et par un autre poète, grâce auquel la terre où l’Isaure verse ses
eaux douces dans la vaste mer sera plus renommée, depuis le
royaume de l’Inde jusqu’à celui des Maures, que la ville de Pesaro,
qui reçut son nom de ce que les Romains y pesèrent leur or. Je veux
parler de Guido Postumo, à qui Pallas et Phébus ont décerné une
double couronne.
La statue de femme qui suivait était Diane. « — Ne vous arrêtez
pas — disait l’inscription — à son air altier ; car son cœur est aussi
sensible que sa figure est belle. — » Le savant Celio Calcaguin, de
sa claire trompette fera longtemps retentir sa gloire et son beau nom
dans le royaume des Parthes, dans celui de Mauritanie, dans l’Inde
et dans toute l’Espagne.
Elle aura aussi, pour chanter sa gloire, un Marco Cavallo, qui fera
jaillir d’Ancône une source de poésie aussi abondante que celle que
le cheval ailé fit jaillir autrefois d’une montagne sacrée, le Parnasse
ou l’Hélicon, je ne sais plus laquelle. Auprès de Diane, Béatrice levait
son front ; l’inscription qui lui était consacrée s’exprimait ainsi :
Vivante, Béatrice rendra son époux heureux ; elle le laissera
malheureux après sa mort,
Ainsi que toute l’Italie qui avec elle sera triomphante, et après
elle retombera captive. Un seigneur de Corregio paraissait écrire et
chanter ses louanges, ainsi que Timotée, l’honneur des Bendedeï.
Tous deux feront s’arrêter sur ses rives, aux sons de leurs luths
harmonieux, le fleuve où il fut pleuré jadis des larmes d’ambre.
Entre celle-ci et la colonne représentant Lucrèce Borgia, dont je
viens de parler, était une grande dame représentée en albâtre, et
d’un aspect si grandiose et si sublime, que sous son simple voile, et
sous ses vêtements noirs et modestes, sans ornements d’or et sans
pierreries, elle ne paraissait pas moins belle, parmi toutes les autres
statues, que Vénus au milieu des autres étoiles.
On ne pouvait, en la contemplant attentivement, reconnaître qui
l’emportait le plus en elle, de la grâce, ou de la beauté, ou de la
majesté du visage, indice de son grand esprit et de son honnêteté.
« — Celui qui voudra — disait l’inscription gravée sur le marbre —
parler d’elle comme il convient qu’on en parle, entreprendra la plus
honorable des tâches, mais sans pouvoir jamais arriver jusqu’au
bout. — »
La statue, douce et pleine de grâce, semblait s’indigner d’être
célébrée dans un chant humble et bas par l’esprit grossier qu’on lui
avait donné — je ne sais pourquoi — sans personne à côté de lui,
pour le soutenir. Tandis que sur toutes les autres statues on avait
sculpté leur nom, l’artiste avait omis de le faire sur ces deux
dernières.
Toutes ces statues entouraient un espace rond, pavé de corail,
maintenu constamment dans une fraîcheur délicieuse par l’eau pure
et limpide comme du cristal qui s’échappait au dehors par un canal.
Ce canal allait féconder, en l’arrosant, un pré aux riantes couleurs
vertes, azurées, blanches et jaunes. L’eau, courant par de
nombreuses rigoles, portait la vie aux plantes et aux arbrisseaux.
Le paladin se tenait à table, raisonnant avec son hôte si courtois ;
de temps en temps, il lui rappelait de tenir sans plus différer ce qu’il
lui avait promis. En attendant, il le regardait, et il avait remarqué
qu’il avait le cœur oppressé d’un grand chagrin, car il ne se passait
guère de moment sans qu’un cuisant soupir s’échappât de ses
lèvres.
Souvent la parole, poussée par le désir, vint jusque sur les lèvres
de Renaud, prêt à renouveler sa demande ; mais la courtoisie
l’arrêtait aussitôt et ne lui permettait pas de la laisser sortir au
dehors. Soudain, le repas terminé, un jeune page, averti par le
majordome, plaça sur la table une belle coupe d’or fin, ornée à
l’extérieur de pierres précieuses, et remplie de vin.
Le châtelain se mit alors à sourire, et leva les yeux sur Renaud ;
mais à qui l’aurait bien examiné, il eût fait l’effet de quelqu’un plus
disposé à pleurer qu’à rire. Il dit : « — Le moment me semble venu
de satisfaire ta curiosité, et de te montrer un chef-d’œuvre qui doit
être précieux pour quiconque a femme à son côté.
« A mon avis, chaque mari doit sans cesse épier sa femme pour
savoir si elle l’aime, si elle lui fait honneur par sa conduite, ou si elle
le déshonore ; si, en un mot elle en fait une bête, ou si elle le traite
comme un homme. Le poids des cornes est le plus léger qui soit au
monde, bien que le plus outrageant. Presque tous les autres le
voient, celui-là seul qui l’a sur la tête ne le sent jamais.
« Si tu sais que ta femme est fidèle, tu as un motif pour l’aimer et
l’honorer davantage ; il n’en est pas de même de celui qui sait que
sa femme est coupable, ou de celui qui doute d’elle et qui souffre de
ce doute. Beaucoup de femmes, chastes et vertueuses, sont
soupçonnées à tort par leurs maris. Beaucoup de maris, au
contraire, sont dans la plus grande confiance à l’endroit de leurs
épouses, qui vont le chef orné de cornes.
« Si tu désires savoir si ta femme est chaste — comme je crois
que tu le penses et que tu dois le penser, car croire le contraire
serait un tourment inutile si tu ne pouvais t’assurer de la vérité par
des preuves — tu peux l’apprendre toi-même sans que personne ait
à te le dire, en buvant dans ce vase. Je ne l’ai pas fait apporter sur
cette table pour un autre motif que pour te montrer ce que je t’ai
promis.
« Si tu y bois, tu verras se produire un effet surprenant. Si tu
portes le cimier de Cornouailles, le vin se répandra entièrement sur
ta poitrine, sans que tu puisses en faire entrer une gouttelette dans
ta bouche. Si tu as une épouse fidèle, tu boiras tout. Or il
t’appartient de connaître ton sort. — » A ces mots, l’hôte s’apprête à
regarder si le vin va se répandre sur la poitrine de Renaud.
Renaud, presque décidé à savoir ce qu’ensuite il sera peut-être
très fâché d’avoir appris, avance la main et prend le vase. Il va pour
tenter l’épreuve ; mais, sur le point d’y porter les lèvres, une pensée
vient l’arrêter. Mais permettez, seigneur, que je me repose ; puis je
vous dirai ce que le paladin répondit.
CHANT XLIII.

Argument. — Renaud entend raconter deux nouvelles, l’une contre les


femmes, l’autre contre les hommes qui se laissent vaincre par
l’ignoble passion de l’avarice. Après un long chemin sur terre et
sur mer, Renaud arrive à Lampéduse, au moment où venait de se
terminer le combat entre les paladins et les païens. Ils
descendent tous en Sicile et, sur la plage d’Agrigente, ils rendent
les derniers honneurs aux dépouilles mortelles de Brandimart. De
là, ils vont à l’ermitage où est Roger, devenu déjà chrétien. Le
bon ermite rend la santé à Olivier et à Sobrin qui se fait aussi
baptiser.

O exécrable avarice, ô insatiable soif de l’or, je ne m’étonne pas


que tu puisses si facilement t’emparer d’une âme vile et déjà souillée
d’autres vices ; mais ce que je ne puis comprendre, c’est que tu
tiennes dans tes liens, que tu déchires de ton même ongle crochu
ceux qui, par leur grandeur d’âme, auraient mérité une éternelle
gloire, s’ils avaient pu échapper à ton atteinte.
Celui-ci mesure la terre, la mer et le ciel ; il connaît à fond les
causes et les effets de toutes les forces de la nature ; il va jusqu’à
scruter les volontés de Dieu. Mais s’il vient à être mordu de ton
venin mortel, il n’a plus d’autre souci que d’entasser des trésors.
Cette seule pensée le domine ; il y place tout son salut, toute son
espérance.
Celui-là met les armées en déroute, et force les portes des villes
de guerre. On le voit, cœur intrépide, se jeter le premier dans les
aventures périlleuses, et s’en retirer le dernier. Mais il ne peut éviter
d’être pris pour le reste de ses jours dans tes filets ténébreux.
Combien d’autres, qui se seraient illustrés dans les arts et dans les
sciences, n’as-tu pas plongés dans l’obscurité !
Et que dirai-je de certaines belles et grandes dames ? Pendant
longtemps, je les vois garder à leurs amants une fidélité plus ferme,
plus inébranlable qu’une colonne. Mais voici venir l’Avarice qui
semble les transformer comme par enchantement. En un jour, qui le
croirait ? elle les jette, sans amour, en proie à un vieillard, à un
scélérat, à un monstre.
Ce n’est pas sans raison que je m’en indigne ; m’entende qui
pourra ; pour moi, je m’entends bien. Dans tous les cas, je ne
m’écarte pas de mon sujet, et je n’oublie pas le thème de mon
chant. Mais je ne veux rien ajouter à ce que je viens de vous dire,
pas plus qu’à ce que je vais vous raconter. Revenons au paladin qui
avait été sur le point d’essayer la vertu de la coupe.
Je vous disais qu’au moment d’y porter les lèvres, une pensée lui
était venue. Après avoir un instant réfléchi, il dit : « — Bien fol serait
celui qui chercherait à savoir ce qu’il serait très fâché d’apprendre.
Ma femme est femme, et toute femme est faible. Gardons ma
croyance sur elle telle qu’elle est. Jusqu’ici, je m’en suis bien trouvé ;
que gagnerais-je à vouloir en faire l’épreuve ?
« Cela me servirait à peu de chose, et pourrait m’être très
désagréable. Il en coûte parfois de tenter Dieu. Je ne sais si en cela
je suis sage ou imprudent, mais je ne veux pas en savoir davantage.
Qu’on ôte donc ce vin de devant moi ; je n’ai pas soif, et je ne veux
pas que l’envie me vienne de boire. Dieu a interdit ces sortes
d’expériences aussi expressément que la science de l’arbre de la vie
à notre premier père.
« De même qu’Adam, après qu’il eut goûté au fruit que Dieu lui-
même lui avait défendu, vit son bonheur se changer en larmes, et
fut obligé de gémir à jamais sur sa propre misère, ainsi l’homme qui
veut savoir tout ce que sa femme fait ou dit, risque de passer de la
joie dans les pleurs, et de ne plus retrouver sa tranquillité première.
— »
Ainsi dit le brave Renaud et, comme il repoussait loin de lui la
coupe pour laquelle il montrait tant de répugnance, il vit un ruisseau
de larmes s’échapper abondamment des yeux du châtelain. Quand il
se fut un peu calmé, ce dernier dit à son tour : « — Maudit soit celui
qui m’engagea à tenter l’épreuve ! Hélas ! il est cause que j’ai perdu
ma douce compagne !
« Que ne t’ai-je connu dix ans plus tôt ! Que n’ai-je pu te
demander conseil avant que mes malheurs aient commencé ! Je
n’aurais pas versé tant de pleurs que j’en suis presque aveugle. Mais
levons-nous de table. Tu vois ma douleur et tu y compatis. Je veux
te raconter la cause et l’origine de mon infortune sans pareille.
« Tu as passé près d’une cité voisine de ce château ; tout autour
d’elle s’étend comme un lac un fleuve qui prend son origine du lac
de Benaco, et qui va se jeter dans le Pô. Cette cité s’éleva sur les
ruines de celle qui avait été fondée par le fils d’Agénor avec les dents
du dragon. C’est là que je naquis d’une famille très honorable, mais
sous un humble toit, et au sein de la pauvreté.
« Si la Fortune n’eut pas assez souci de moi pour me donner la
richesse due à ma naissance, la nature y suppléa en me douant
d’une beauté fort au-dessus de celle des gens de ma condition. Bien
qu’il soit ridicule à un homme de se vanter lui-même, je puis dire
que, dans ma jeunesse, j’ai vu dames et damoiselles s’éprendre de
ma figure et de mes belles manières.
« Il y avait dans notre cité un homme sage, et savant au delà de
toute croyance. Il comptait cent vingt ans accomplis, quand ses yeux
se fermèrent à la lumière. Il avait passé toute sa vie seul et
sauvage ; mais, dans son extrême vieillesse, féru d’amour pour une
belle matrone, il l’avait obtenue à prix d’argent, et en avait eu
secrètement une fille.
« Pour éviter que la fille ne fît comme sa mère, qui pour de
l’argent avait vendu sa chasteté, bien précieux que tout l’or du
monde ne saurait payer à sa valeur, il résolut de la soustraire au
contact populaire. Choisissant le lieu qui lui parut le plus solitaire, il y
fit bâtir ce palais si ample et si riche, de la main de démons évoqués
par ses enchantements.
« Il fit élever sa fille par de vieilles femmes réputées pour leur
chasteté. Celle-ci devint par la suite d’une grande beauté. Non
seulement son père ne permit pas qu’on lui laissât apercevoir un
homme, mais il défendit qu’on en prononçât le nom devant elle. Afin
de lui mettre un continuel exemple sous les yeux, il fit sculpter ou
peindre l’image de toutes les dames qui ont su résister à un amour
coupable.
« Il ne se borna pas à faire représenter celles qui par leur vertu
ont été l’honneur des premiers âges, et dont l’histoire ancienne a
consacré à jamais la renommée ; il voulut aussi y faire figurer les
dames dont les mœurs pudiques devaient dans l’avenir illustrer
l’Italie. En raison de leur belle conduite, il fit élever leur statue,
comme les huit que tu vois autour de cette fontaine.
« Quand le vieillard jugea que sa fille était un fruit assez mûr
pour que l’homme pût le cueillir, je fus, soit malechance, soit hasard,
choisi entre tous par lui comme le plus digne. Outre ce beau
château, tous les champs, tous les étangs à vingt milles à la ronde
me furent donnés comme dot de sa fille.
« Celle-ci était aussi belle et aussi bien élevée qu’on pût le
désirer. Elle surpassait Pallas pour les travaux à l’aiguille et la
broderie ; à la voir marcher, à l’entendre parler ou chanter, on aurait
dit une déesse, et non une mortelle. Elle était presque aussi versée
que son père dans tous les arts libéraux.
« A cette haute intelligence, à cette beauté non moindre qui
aurait séduit les rochers eux-mêmes, elle joignait une sensibilité, une
douceur de caractère dont je ne puis me souvenir sans sentir le
cœur me manquer. Elle n’avait pas de plus grand plaisir, de plus vive
satisfaction que d’être auprès de moi partout et toujours. Nous
vécûmes longtemps ensemble sans avoir la moindre querelle, mais,
à la fin, cette paix intérieure fut troublée, et par ma faute.
« Il y avait cinq ans que j’avais mis mon cou sous le nœud
conjugal, lorsque mon beau-père mourut. Cette mort fut comme le
signal des malheurs dont je ressens encore le contre-coup. Je te
dirai comment. Pendant que je me renfermais ainsi dans l’amour de
celle dont je viens de te faire un tel éloge, une noble dame du pays
s’éprit de moi autant qu’on peut s’éprendre.
« Elle en savait, en fait d’enchantements et de maléfices, autant
que pas une magicienne. Elle aurait pu rendre la nuit lumineuse et le
jour obscur, arrêter le soleil et faire marcher la terre. Cependant elle
ne put parvenir à ce que je consentisse à poser sur sa blessure
d’amour le remède que je n’aurais pu lui donner sans offenser
souverainement ma femme.
« Non pas qu’elle ne fût très gente et très belle dame, non pas
que j’ignorasse qu’elle m’aimait à ce point ; mais ni ses offres, ni ses
promesses, ni ses obsessions continuelles ne purent jamais
détourner à son profit une étincelle de l’amour que je portais à ma
femme. La certitude que j’avais dans la fidélité de cette dernière
m’empêchait de songer à une autre qu’elle.
« L’espoir, la croyance, la certitude que j’avais dans la fidélité de
ma femme m’auraient fait dédaigner toutes les beautés de la fille de
Léda, toutes les richesses offertes jadis au grand berger du mont
Ida. Mais mes refus ne pouvaient me débarrasser de la poursuite de
la magicienne.
« Un jour qu’elle me rencontra hors du palais, la magicienne, qui
se nommait Mélisse, put me parler tout à son aise, et trouva le
moyen de troubler la paix dont je jouissais. Elle chassa, avec
l’éperon de la jalousie, la foi que j’avais en ma femme. Elle
commença par m’insinuer que j’étais fidèle à qui ne l’était pas envers
moi.
« — Tu ne peux pas — fit-elle — dire qu’elle t’est fidèle, avant
d’en avoir vu la preuve. De ce qu’elle n’a point encore failli, tu crois
qu’elle ne peut faillir, et qu’elle est fidèle et chaste. Mais si tu ne la
laisses jamais sortir sans toi, si tu ne lui permets jamais de voir un
autre homme, d’où te vient cette hardiesse d’affirmer qu’elle est
chaste ?
« Absente-toi, absente-toi un peu de chez toi ; fais en sorte que
les citadins et les villageois sachent que tu es parti et que ta femme
est restée seule. Laisse le champ libre aux amants et aux messagers
d’amour : si les prières, si les cadeaux ne peuvent la pousser à
souiller le lit nuptial, alors, tu pourras dire qu’elle est fidèle. — »
« Par de telles paroles et d’autres semblables, la magicienne
poursuivit jusqu’à ce qu’elle eût éveillé en moi le désir de mettre à
l’épreuve la fidélité de ma femme. « — Supposons — lui dis-je alors
— qu’elle ne soit pas ce que je pense ; comment pourrai-je savoir
d’une manière certaine si elle mérite le blâme ou l’éloge ? — »
« Mélisse répondit : « — Je te donnerai une coupe qui possède
une rare et étrange vertu. Morgane la fit autrefois, afin de prouver à
son frère la faute de Ginevra. Celui dont la femme est sage peut y
boire ; mais celui dont la femme est une putain ne le peut, car le vin,
au moment où il croit le porter à sa bouche, s’échappe de la coupe,
et se répand sur sa poitrine.
« Avant de partir tu en feras l’épreuve, et je crois que cette fois
tu pourras boire d’un trait. Je pense en effet que ta femme est
encore innocente, et tu le verras bien. Mais si, à ton retour, tu tentes
une nouvelle épreuve, je ne réponds pas que ta poitrine ne soit
inondée. En tout cas, si tu ne la mouilles pas, si tu bois sans
obstacle, tu seras le plus fortuné des maris. — »
« J’acceptai la proposition. Mélisse me donna la coupe ; je fis
l’expérience en question et tout alla bien : je vis que ma chère
femme était jusque-là chaste et bonne. Mélisse me dit : « —
Maintenant, laisse-la pendant quelque temps. Reste loin d’elle
pendant un mois ou deux, puis reviens, et fais une nouvelle
expérience avec la coupe. Tu verras alors si tu pourras boire, ou si tu
te mouilleras la poitrine. — »
« Il me sembla dur de quitter ma femme, non pas que je
doutasse de sa fidélité, mais il ne me semblait pas possible de m’en
séparer, même une heure. Mélisse me dit : « — Je te ferai connaître
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like