DayDreamin’ Comics https://ddcomics.org/ Have you ever seen a dream walking? Well i did. Fri, 25 Sep 2026 12:14:19 +0000 en-US hourly 1 https://wordpress.org/?v=7.1.2 https://ddcomics.org/wp-content/uploads/2023/07/cropped-DD-icon-32x32.jpg DayDreamin’ Comics https://ddcomics.org/ 32 32 Write up on Ray Russell ‘s Unholy Trinity https://ddcomics.org/2026/09/25/write-up-onray-russell-s-unholy-trinity/ https://ddcomics.org/2026/09/25/write-up-onray-russell-s-unholy-trinity/#respond Fri, 25 Sep 2026 12:13:15 +0000 https://ddcomics.org/?p=7523 Background of Study Ray Russell (1924-1999) was an American writer and editor, known for his contributions to the genres of horror and science fiction. Born in Chicago, he developed an early interest in these genres through pulp magazines. After serving in the U.S. Army Air Force during World War II, Russell studied music and theater, […]

The post Write up on Ray Russell ‘s Unholy Trinity appeared first on DayDreamin’ Comics.

]]>
Background of Study

Ray Russell (1924-1999) was an American writer and editor, known for his contributions to the genres of horror and science fiction. Born in Chicago, he developed an early interest in these genres through pulp magazines. After serving in the U.S. Army Air Force during World War II, Russell studied music and theater, which influenced his literary work. He began his writing career with a sale to Esquire in 1953 and later became an influential figure at Playboy magazine, where he served as associate and executive editor and helped elevate fantasy and science fiction within mainstream literature.

His best-known short story, “Sardonicus,” exemplifies his gothic style, exploring themes of guilt and the supernatural, and was adapted into a film. In addition to short stories, Russell authored novels that often delved into macabre subjects, with works like *The Case Against Satan* foreshadowing later horror classics. Throughout his career, he received recognition for his work, including the Sri Chimnoy Poetry Award in 1977. Russell’s legacy endures through his extensive body of work, which continues to influence the horror and fantasy genres.

Raymond Robert Russell was born on September 4, 1924, in Chicago, Illinois. As a child he discovered science fiction and fantasy through pulp magazines, which he read regularly. He served in the U.S. Army Air Force from 1943 to 1946, and upon returning from active duty enrolled at the Chicago Conservatory of Music, studying there from 1947 to 1948. He also attended the Goodman Memorial Theater from 1949 to 1951. He married in 1950 and he and his wife, Ada, had three children. Russell composed some music for piano and performed in summer stock theater productions. These experiences laid the foundation for a number of his short stories which featured musical themes and actor characters.

Russell contributed fiction, poetry, and essays to the Paris Review and other prestigious literary magazines. His first fiction sale, “The Lesser Sin,” was to Esquire in 1953. Within a year he was working at Playboy magazine, where he served as associate and executive editor from 1954 to 1960, and then as consulting editor for many years after. Russell’s literary inclinations and his preference for fantasy and science fiction helped shape the contents of the magazine. Many leading genre writers of the postwar years, including Ray Bradbury, Richard Matheson, and Charles Beaumont, appeared regularly in its pages during his tenure, and their association with the magazine and the roster of prestigious mainstream writers it published helped give fantasy and science fiction a respectability with a general readership that it might not otherwise have enjoyed at that time. While at Playboy, Russell served as the unnamed editor of more than forty anthologies of fiction distilled from the magazine, including The Playboy Book of Fantasy and Science Fiction (1966) and The Playboy Book of Horror and the Supernatural (1967).

His own stories appeared sporadically in science-fiction digests such as Imagination and Fantastic in 1955. He wrote his best-known work of short fiction, “Sardonicus” (1961), in conscious emulation of classic gothic fiction. A period piece about a man so smitten with guilt over robbing his own father’s grave that it causes his grotesque facial deformity, it showed an astute grasp of the classic gothic’s juggling of the psychological and supernatural. The story anchored Russell’s first collection, Sardonicus, and Other Stories (1961), and Russell wrote the script for director William Castle’s film adaptation of the story, Mr. Sardonicus, released in 1961.

“Sardonicus” set the tone for much of Russell’s writing thereafter, including the old-fashioned gothic tales “Sagittarius” (1962) and “Sanguinarius” (1967), which he would combine in collections Unholy Trinity (1967) and Haunted Castles: The Complete Gothic Tales of Ray Russell (1985). He worked on screenplays for The Premature Burial (1962), X: The Man with the X-Ray Eyes (1963), and several other horror films. Although he was best known as a writer of short fiction and published more than a hundred stories in his lifetime, he also wrote novels. His first, The Case Against Satan (1962), anticipated William Peter Blatty’s best-seller The Exorcist (1971)in its account of a child’s demonic possession. His novels Incubus (1976) and Absolute Power (1992) were also on macabre themes, while Princess Pamela (1979) was a historical romance with fantasy overtones. In 1977, Russell won the Sri Chimnoy Poetry Award. He died on March 15, 1999, at a nursing home in Los Angeles, California, from complications following a series of strokes.

Literature Review
Unholy Trinity

A Collection of three longish short stories from the mid-1960s that hark back to the glory years of Gothic and exist somewhere between homage and pastiche.

The first, ‘Sanguinarius’, is a reworking of the story of Countess Elizabeth Bathory, the 16th century Hungarian aristocrat who became one of history’s most notorious mass murderers. Told from her perspective, it takes on the sheen of an apologia, but is somewhat constrained by Russell’s decision to write it as though it were an authentic 16th century text, translated contemporaneously into English. It’s a nice idea, but not one that he pulls off:

Now stretch’d a span of time bereft of bliss, like to an arid desert waste which one traverses without hope, on bleeding feet, one’s skin aflame , the flesh and humours parch’d beyond endurance, the very soul a festering cicatrix. Such was my lot, with Ferencz gone. (p.27)

The final story, ‘Sagittarius’, also bounces ideas off a psychopath from history – in this case, Gilles de Rais, but there are also elements of Jekyll & Hyde, Jack the Ripper and the Théâtre du Grand Guignol. And it’s a fun little historical romp, framed in the traditional manner by an elderly man recounting tales of his youth.

And in the middle there’s the strongest of the trio. ‘Sardonicus’ is the story of a wealthy Polish man whose face is frozen into a horrifying grin akin to that of the risus sardonicus found in extreme cases of lockjaw. Told by the eminent English doctor summoned to try radical treatments to cure this chronic affliction, it’s got a very Poe-lite feel that can’t help but entertain fans of traditional horror.

It was filmed in 1961 by William Castle as Mr Sardonicus and proved to be one of Castle’s better efforts, i.e. it was still total rubbish but it was at least watchable. Russell adapted the story for the screenplay, which was the strongest element in it. The weakest was the traditional Castle gimmick, which in this instance was an appearance by the old charlatan himself asking the audience to vote on whether the villain should be punished or not. The result of the so-called Punishment Poll was clearly known in advance, since no alternate ending, with Sardonicus getting away with his crimes, was ever filmed.

Anyway, the appeal of the book is the gleefully dated quality of the writing. This is the 1960s, after all, when the past came up for grabs, when playing with history was hip. Pure froth, but cool.

First published back in 1964, US author Ray Russell’s ‘Unholy Trinity’ offers up three short stories of that hark back to the dark years of gothic horror and exist somewhere between homage and pastiche.

The book begins with a four page introduction by the author entitled ‘The Haunted Castle: A Confession’ in which Russell provides the reader with a brief insight into the three short stories included in the book; telling of his deep love for “good old aromatic baroque tales” and his inspiration for their subject matter.  For a short little introduction this four page addition serves as a delightfully mood setting beginning for the delightfully gothic treats to follow.

Sanguinarius – 42 pages
Incarcerated in the Castle Csejthe, Countess Elisabeth Bathory ponders the horrors that she was led into after becoming the young virgin bride of Count Ferencz Nadasdy.  As a mere fifteen year old girl, Elisabeth was swept up by the handsome and masterful twenty-one year old Count.

At first Elisabeth was overwhelmed with love and desire for the man.  She basked in the warmth of his embrace and worshipped the deeply charismatic lover that he was.  And following their marriage the young couple became near reclusive, wishing instead to spend all their time with each other.  But when the Count is called away to war, Elisabeth is left alone in the great castle with just her loving maid Ilona Joo to aid her.  But that all changes when the gypsie woman Dorottya arrives to offer her assistance.  Their friendship quickly blossoms and the Countess’ longings for her departed husband soon subside.

However, when the Count Ferencz Nadasdy returns to his castle, to be greeted by his loving wife and her new bosom friend, something more sinister starts to stir.   And as the days pass by, a dark and blasphemous cloud begins to descend over Castle Csejthe and its inhabitants…

Written in the first-person-perspective of Countess Bathory herself, Russell offers up an intriguing alternative of the notoriously bloodthirsty tale of the 16th century Hungarian aristocrat Countess Elizabeth Bathory who later became known as one of history’s most notorious mass murderers.  Somewhat uniquely told from the Countess’ perspective, the short takes on a daring breath of defence for the young woman’s bloody actions, painting a picture of coercement and deflected blame.  The story is ultimately resigned to a hellish tragedy, with a thriving gothic misery engulfing our narrator as the horrors spiral towards the Countess’s pitiful end.  Russell adopted a particularly 16th century prose to the writing of the short, giving an added historical and credible atmosphere to the storytelling and ultimately making a much more befitting and honest backdrop for this cruel and gloomy tale.

Sardonicus – 42 pages
Upon receiving a letter from his ex-lover Maude Randall (now Madam Sardonicus) whom he hasn’t seen for over seven years, Sir Robert Cargrave decides to take up her offer of a fortnight stay at the now married couple’s Castle in Bohemia.  And so Cargrave leaves his home in London and journeys to Paris, then on to Berlin, until finally arriving at Castle Sardonicus.  There the highly revered doctor is met by a downcast Maud who introduces her withered and deeply disfigured husband.  Cargrave is told of the wealthy Polish man’s misfortune in receiving a seemingly permanent ghastly grin across his face after exhuming his father’s corpse for a winning lottery ticket that was buried about his person.  In order to correct the terrible infliction that Sardonicus had received – akin to that of the ‘Risus Sardonicus’ found in extreme cases of lockjaw – the doctor will have to perform surgery upon the desperate man’s face.  Surgery that Sardonicus is very persuasive in receiving…

Russell’s second tale in his ‘unholy trinity’ is certainly a bizarre one.  The strange summoning and acceptance of Maude’s invitation to Castle Sardionicus introduces what is to slowly become a surreal and creepily unusual tale.  This time Russell adopts a purposefully nineteenth century prose to the writing, setting a quietly atmospheric mood that gradually enwraps the reader in a smothering case of odd misfortunes and utterly out-of-place demands.  The warped nature of the tale works well with the gothic setting, creating an altogether chilling and frightfully compelling read.

The short was later made into the feature length film ‘Mr. Sardonicus’ (1961) which was directed by William Castle, in which Russell himself adapted the story for the screenplay.

Sagittarius – 42 pages
Back in 1909, when he was only around twenty-three years old, the Earl Terrence Glencannon (better known as Lord Terry) was living in Paris and enjoying the culture that the great city had to offer.  Back then two names in particular ruled the theatre floorboards – Sellig and Laval.  Lord Terry followed the performances of the two actors closely, having only just discovered Laval’s dominating performances of frightful monsters and beasts of horror.  In direct comparison Sellig was a man of the arts.  Prone to classically heroic performances within highly revered plays.  However, neither actor held each other in particularly high esteem.  But they had their own connection.  Their own unspoken bond.  And it will take the gruesome slaughter of a young and innocent girl to reveal the true horror of the theatre…

Much more modern-day in feel and atmosphere, this rich and doting homage to theatre and the artistry of horror serves up a wickedly endearing storyline.  Admittedly somewhat slow in getting underway, the storyline instead builds upon tight characterisation from our narrator – Lord Terry and the two highly revered but very much conflicting actors.  Once all of our principal pawns in the plot are met and appropriately established, Russell begins embarking on an elaborate storyline that weaves in the plots of classic horror stories to form a magnificently celebratory horror story.  Expect twists and turns that throw the reader from one conclusion to the next until the final curtain ends this triumphant homage to the dark arts.

The post Write up on Ray Russell ‘s Unholy Trinity appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/25/write-up-onray-russell-s-unholy-trinity/feed/ 0 7523
Write up on Joyce Oates’s “Expensive People https://ddcomics.org/2026/09/25/write-up-on-joyce-oatess-expensive-people/ https://ddcomics.org/2026/09/25/write-up-on-joyce-oatess-expensive-people/#respond Fri, 25 Sep 2026 12:06:55 +0000 https://ddcomics.org/?p=7525 Joyce Oates’s “Expensive People Background of the Study There is no more versatile and accomplished American writer than Joyce Carol Oates. The author of many books, Oates has penned bestselling novels, critically acclaimed collections of short fiction, as well as essays, plays, poetry, memoirs, and an unlikely bestseller, On Boxing. Her remarkable literary industry – […]

The post Write up on Joyce Oates’s “Expensive People appeared first on DayDreamin’ Comics.

]]>
Joyce Oates’s “Expensive People

Background of the Study

There is no more versatile and accomplished American writer than Joyce Carol Oates. The author of many books, Oates has penned bestselling novels, critically acclaimed collections of short fiction, as well as essays, plays, poetry, memoirs, and an unlikely bestseller, On Boxing. Her remarkable literary industry – which includes work as an editor and anthologist – spans forms, themes, topics and genres. Writing in The Nation, critic Henry Louis Gates Jr. said, “A future archeologist equipped only with her oeuvre could easily piece together the whole of postwar America.” In 2010, reflecting the widespread esteem in which her work is held, President Barack Obama awarded Oates the National Humanities Medal.

Best known for her fiction, Oates’ novels include them, which won the National Book Award; The Falls, which won the France’s Prix Femina; and We Were the Mulvaneys, which follows the disintegration of an American family and which became a bestseller after being selected by Oprah’s Book Club. Other novels include The Accursed, which Stephen King described as “the world’s first postmodern Gothic novel,”  A Book of American Martyrs, which received the Los Angeles Times Book Prize, and 48 Clues into the Disappearance of My Sister which received the Prix Fitzgerald.

Her 2025 novel Fox, received star reviews from Booklist, Kirkus, Library Journal, and Publishers Weekly, while the New York Times called it “impressive and unsettling.” Her 2026 titles include The Frenzy which received a star review from Publishers Weekly, and the reprint collections Double Trouble and Second Nature(Hard Case Crime, September 19, 2026) each containing two novels and two short stories originally written under the pseudonym Rosamond Smith. In 2027 she will release a book of stories titled The Massacre at Mount Pitcairn (The Mysterious Press, January 19, 2027), and a novel titled Orphan (Hogarth, June 15, 2027).

High Lonesome: New and Selected Stories 1966-2006 gathers Oates’ short fiction from earlier collections and includes eleven additional tales that further demonstrate the artistry and originality of a writer who “has imbued the American short story with an edgy vitality and raw social surfaces” (Chicago Tribune). Included in this volume is Oates’ most anthologized short story, “Where Are You Going, Where Have You Been?” Inspired by a song by Bob Dylan, it was later adapted as a film, Smooth Talk. It is one of a handful of Oates’ works made into films or movies for television, including Foxfire: Confessions of a Girl Gang (2012), by Palme d’Or winner Laurent Cantet. Oates’ novel Blonde was adapted for the stage by Argia Coppola as Love is Blonde and also as a film for Netflix directed by Andrew Dominik and starring Ana de Armas.

Since 1963, over forty of Oates’s books have been included on the New York Times list of notable books of the year. Among her many honors are two O. Henry Prizes and five Bram Stoker Awards, the PEN/Malamud Award for Excellence in Short Fiction, a World Fantasy Award, and the M. L. Rosenthal Award from the National Institute of Arts and Letters. She has received the Ivan Sandrof Lifetime Achievement Award by the National Book Critics Circle, the Mailer Prize for Lifetime Achievement, the PEN Center USA Award for Lifetime Achievement, the Poets & Writers Distinguished Lifetime Award, the Bilbao BBK Ja! Prize, The Jerusalem Prize, the Prix mondial Cino Del Duca, the 2023 Taobuk Award for Literary Excellence, and the 2026 World Fantasy Award for Lifetime Achievement. She is the subject of a documentary titled A Body in the Service of Mind, directed by Stig Björkman and produced by Mantaray Film. She is also a member of the American Academy of Arts and Letters.

Significance of the Study

Richard Everett, the narrator of this novel, is not like the main characters in Oates’ previous novels. Not only is he male and a child (he is around ten years old when the novel starts), he is brought up in a very affluent environment. His father is a successful executive, rapidly rising up the corporate ladder. His mother – Natashya Romanov but wittily known as Nada – is a minor novelist with some success. She pretends to be the daughter of Russian aristocrats but is, in fact, the daughter of poor Russian immigrants. Richard is infatuated with his mother and is continually spying on her. She, however, is less interested in him and frequently goes away, to have affairs and for other R & R activities. But when Richard finds both her notebook, with ideas for a story about a young man who snipes at people, missing the first three times but, now he is conditioned, being more successful the fourth time, and her short story The Molesters, an actual short story written by Oates, he plans her murder. The novel is the eighteen year old Richard writing about it. However, it is left unclear as to whether he did kill his mother or only did so in fantasy. Once again, Oates shows us the violent and seamy side of American life, even if, this time, it is from on top and not down below. And, once again, it is a very successful novel.

In“Expensive People,” Joyce Carol Oates has made a very large demand upon her literary imagination and her talent. She has asked herself to become a 250-pound 18-year-old boy- genius sitting alone in a shabby rented room composing a memoir about how he assassinated one of his parents seven years before. The novel has, among its other qualities, a great deal of good old- fashioned suspense, so I won’t say which parent, although by the time the act is committed this choice has the inevitability of tragedy.

Miss Oates, as her earlier books “A Garden of Earthly Delights” and “With Shuddering Fall” established, has a great deal of talent, and it rises strongly to this formidable challenge.

Richard, who is 10 years old and then 11 during the events he is feverishly telling us about, is a queasy library person,” all thick glasses and ailments and precocity, a child of affluence whose parents rather forget he exists for long periods. Moving from one privileged Midwestern suburb to another as his father rises in the corporate world, he is thrust, aged 10, into a certain species of academically demanding, expensive private school to which bright, rich, neglected boys are sent too young. This frees his father to continue his business successes; and it frees his mother, Nada, to be nothing in the family group.

Nada is the core of the novel. She is a beautiful woman in her thirties, Russian by descent, determined to have all the privileges of affluence but driven periodically to abandon her husband and son and suburb for New York, lovers and literature. Nada is a writer of national reputation. An extremely effective, and relevant, story by her is printed to prove her talent. In her family, and in this novel, however, we do not otherwise experience that side of her. “My mother wasn’t stupid,” Richard writes, “but for some reason I will never know she acted stupid most of the time. She was deliberately, spitefully, stubbornly, passionately stupid.” I will never know the reason for that either.

Miss Oates has no trouble becoming a semi-insane, boy-genius murderer, but she doesn’t quite bring off a talented woman writer. We do not see many responses to her beauty, except her son’s, so we have to take that quality of hers more or less on faith too. It is her stupidity, bitchiness, solipsistic outlook, and superficiality that is portrayed in the novel.

Nada loves the suburbs. She writes with extreme sensitivity and skill, but she loves the Anglophile country clubs, the comfy libraries, the horrendous beauty shops Miss Oates evokes so well. This world of fit men and slim women who never “come loose” is expertly depicted in all its privilege and isolation. But finally Nada’s other nature reasserts itself, and she flees to some invisible Bohemia; and Richard, after this third abandonment by an adored mother who was in any case “always backing out of the driveway,” slips into a permanent daze. Most persuasively, Miss Oates then leads us through his alienation, his ordering a shotgun by mail, his deliberately off-target pot shots at the neighbors, to the moment when he must turn on one of his own parents.

Does anyone question the wide and immediate relevance of this material? I wonder how many hundred, or thousand, American boys each year suddenly begin sniping at people. And the role the sudden shot out of nowhere has played on our national scene is there before us.

Technically, Miss Oates had many problems, with which she was usually, but not always, successful. The most pressing problem with first-person narrative is how to include scenes the narrator would not ordinarily witness. No unearthed diaries or stumbled-upon letters for Joyce Carol Oates. Her narrator is a compulsive spy, that’s all, and skillfully uses laundry chutes and upstairs landings to eavesdrop.

First-person narrative is a powerful and tricky concoction. Like a shot of sodium pentothal. it leads to eloquent self-revelations, to strong, immediate effects, and it can also lead to self-concern, self- indulgence, this-is-me-in-all-my-complexity writing. This occurs from time to time here. Richard Everett interrupts his gripping narrative quite often to insist that this is fact, not fiction, that it is all absolutely true and therefore hasn’t the formal organization of fiction. And yet he writes all these conventionally expert novelistic scenes. He digresses to give us his views on art, writing, imagery, puns, you, me, and so on. For example, he wrote this review for me.

In 1968 we want the facts; we want “The Confessions of Nat Turner,” just as though they were really his; we want “In Cold Blood,” and Miss Oates here gives us what might be subtitled “The Absolutely True Confessions of a Parent Murderer.” Very well, if she wants it that way. I myself didn’t need it. I was more than willing to believe that this excellent novel was all too desperately true of human nature, of intellectually gifted, neglected boys, of our affluence and our strangeness in this country now.

Mr. Knowles’s new book is “Phineas and Other Stories.”

Expensive People and Wonderland both contain families that reside in suburbia and embody the kind of life Oates presents as typical of that area. Both suburban families are financially comfortable and socially elite, but neither is secure and happy. Though material success has been gained, familial relationships have been lost in the pursuit of the American dream that has led both families to suburbia. Natashya (Nada) and Elwood Everett of Expensive People are showy, pretentious people, proud of their place on the social scale and struggling hard to live beyond their means. Their cars (a Cadillac and a Lincoln) and their clothes (a mink coat for Nada and an expensive overcoat for Elwood) typify their existence; they are obviously moneyed and snobbish. Keeping up the pretense of wealth is important to them; in fact, that pretension is the subject of their first argument in the novel. Elwood thinks the price of the house they are looking at is inflated, and the real estate salesman appears indignant that Mr. Everett

would not recognize the quality of the home. Natashya is embarrassed, feeling that Elwood has made them seem common; truly rich people do not care about price. Her whispered admonition to him: “Shut up, you stupid son-of-a-bitch! Oh, you loud-mouthed, vulgar son-of-a-bitch””-^ draws surprise from the realtor, but the child-narrator of the story is unshaken. In the interior monologue that comprises the entire novel, he recounts: “I smirked a little and tried to catch his eye so he’d know this was nothing unusual, don’t be upset, oh, nothing unusual! Common, daily!” (p. 16). In just such an environment the child, Richard, has grown to be ten years old. His family is hardly the picture of suburban tranquillity, but he believes that he and his parents are happy, even though a friend told him once that when the three of them were walking together, they looked like “three strangers who have met by accident on a walk and are waiting for the first chance to get away from one another” (p. 19). Richard’s belief in the family unit is a fantasy that he has constructed to cover the reality of their personalities:

Richard has even entertained doubts that those two people—Natashya and Elwood—are really his parents. He loves them, undoubtedly, but their lack of real familial relationships causes him to wonder about the nature of their kinship. Of Elwood he observes: while I loved Father I did not really believe he was my father. .. . I thought that another father might be waiting somewhere off in the wings and that at the next cocktail party, if I listened hard and crept as close to the living room as I dared, I might hear the strong, hard, even brutal voice of my true father. (pp. 24-26)

 The boy also questions the idea of Nada’s being his mother: I stared at her and wondered if she was my mother, if she was my mother, and how had it come to pass? How was it possible she made me undergo such torture and had nothing to offer me as consolation but the glitter of Father’s jewels? (p. 45) Though the family situation is precarious as the novel begins, Richard can remember when it was even worse. His mother’s artistic temperament causes her to be restless, and every now and then she leaves her husband and child, though they plead with her to stay. The child is now almost eleven, and he remembers two epidodes of separation from his mother: one when he was six and one when he

was nine. He senses that she will leave again someday soon, and his foreboding is correct, though it is not to happen just yet. Richard’s insecurities are not unfounded; he frequently answers the telephone to hear a man’s voice asking for his mother, and he senses an intimacy between the two of them. Between himself and his mother there is no intimacy, only a sense of desperation: Nada trying to escape from the humdrum of her existence, and Richard holding on to her, knowing despairingly that she is destined to leave him. Though the fight between Nada and Elwood over Mr. Everett’s behavior to the real estate salesman is the first mentioned in Richard’s memoir, it is by no means the last. The child admits to being an eavesdropper, and what he hears is: The fight over a stained silk cushion on a Queen Anne chair, on our first day in the house.

 The fight over Father’s Negro jokes at a party. The fight over Father’s “baggy trousers.” The fight over Father’s shirts, which were all dirty. The fight over Nada’s correction of Father’s pronunciation of “incognito.” The fight over Nada’s naive admiration for the local and internationally famous H F , whom Father renounced with middle-class gusto, along with his wife. The fight following from this, when Father called Nada a parvenu. The shrieking fight over the mildew in the front lawn, which was gray-blue and deadly. The hysterical fight over my eyeglasses. (“Whose eyes did he inherit, whose? He’ll have glasses like the bottoms of Coke bottles . . .”) The fight over the canned goods in the basement storeroom, whose labels had all peeled off mysteriously. The fight over the warped piano key—I believe it was G two octaves above middle C.

The fight over . . . And, a week ago, another ficjht over—I believe it was over Jean-Paul Sartre, whom Father rejected as a “Communist writer.” And . . . And all the other fights that were about nothing, (pp. 82-83) The fights continue until no holds are barred and they scream accusations at each other, Nada accusing Elwood of hating her, and Elwood telling Nada that she is neurotic and crazy, and if she should leave again, he would not ask her to come back. Richard’s own sad but accurate comment on their emotions explains precisely the state of the suburban family: “When all their stage props were ripped away, they always showed that they needed no fresh reasons to hate. They simply hated” (p. 84). In spite of Nada’s apparent obliviousness to her son, he continues to love her wholly and selfishly. When he knows that she is going to leave, he becomes sick; surely she wouldn’t leave her child in his time of illness! But she plans to do just that, and when she begins her speech explaining her need for freedom, Richard knows all the words and the reasons and just wants her to get out and spare him the misery of prolonging her farewell. The days that follow should have been happy for him; Elwood and the boy do all the things fathers and sons should do together but these two have somehow ignored. Above all, pretenses must be kept up, and Elwood tells an inquisitive “friend” of Nada’s that she has merely gone east to visit

Expensive People, then, traces the Everetts through their lives as a suburban family and shows the decline of familial relationships in that setting. The mother is primarily to blame for the family’s failures, but Oates also provides background to show that she too is a product of her family environment. Living in an expensive house and entertaining wealthy people does not give the Everetts the satisfaction they are seeking; nor does Richard find happiness in the private school to which he, along with other neglected suburban boys, is sent. Nada escapes from her urban parents and their restraints only to find that 72 suburban life also has responsibilities, responsibilities that she does not want and cannot handle.

The decadent family in this novel is the result of the lack of love that necessarily occurs between selfish people, but it is the child of the family who suffers the most even though he is the one who has the capacity for loving. As has been the case with urban families and rural families, the mother holds in her hands the ability to create whatever family atmosphere she desires, but contemporary mothers, at least in Oates’s novels, refuse to look beyond themselves. The unwanted child of Expensive People rebels against his suburban home and parents, resorting to an act of violence to sever completely the relationship between the family members.

Natashya’s Desire and Cause for Materialistic Pleasure: The downfall of Natashya plays a significant role in Joyce Carol Oates’s novel Expensive People. The reader’s cognition makes a debate with the text to expose the existing flaws that lead to her death. The title Expensive People itself has some metaphorical aspects because it almost reveals the context of the text. At first glance, the reader of the text will dive to the conclusion that the plot of the novel is about some issues of a well-settled sophisticated family. But culling out deeper uncovers the unexplored meaning of the text. The present research raises various questions regarding the chaotic end of Natashya. These questions appeal to the cognitive efficiency of the reader. A bonding between a mother and her son is stronger than any relationship.

 But Natashya Romanov’s love for Richard is very flat. She is a self-centered woman, who rejects her family and wishes to live an independent life. Natashya’s quest for worldly pleasure makes her travel on the path of anti-feminism which is a considerable satire Oates proposes in the plot. Natashya’s quest for earthly yearning stems from her difficult childhood experiences due to her Russian heritage. Nada’s mental behaviors can be investigated as the struggling life of a Russian immigrant in America. Nada discloses the truth about her ambition for popularity towards the end of the tale and wonders about the null reason behind her Jewish ancestor’s execution. Nada strongly believed that she will be also getting executed for no reason, so she decides to get a prominent position in society to escape her imaginary tragic ending. Nada’s early-stage struggling horrors her throughout the novel. This is one of the hubris of her in the novel.

Natashya Romanov’s quest for earthly pleasure is visualized in the first section of the novel, where she orders her husband to procure the property in Fernwood despite their economic condition. Because Fernwood in the novel gets compared to ‘Paradiso’, it is the coziest place, where all the well-settled people reside. She shared no emotions for her son and husband. Her thirst for fame and power made her forget Richard, which eventually leads to her tragic flaw. She is a perfect projection of a woman who misunderstands the concept of feminine equality and eventually follows the path of anti-feminism. To portray herself as a member of an aristocratic society, she started writing fiction and ordered her husband to buy a house in Fernwood. She was intoxicated with it. She was intoxicated with our house – with her new expensive furniture, her marble-topped table and her exquisite bookshelf, given to her by father’s great-aunt and worth oh let me

tell you! – quite a bit. She was intoxicated with expensive tidbits ginger had unfrozen not half an hour before, she was intoxicated with her white, white dress. (Oates, 46) Throughout the narrative, Nada is fascinated by her fashion sense. Nada’s actions or societal sense might be identified ironically because she pays more attention to her dress while still keeping her room unclean. Also, she never acknowledges the time with her family and enjoys solitude in her room. She spends hours with her typewriter which has caused difficulties for her family.

Richard dislikes Natashya from an early age due to her selfish nature and her preference for more expensive items than her son. She never provided Richard with what he lacked. The plot’s first problem is a lack of love for an eleven-year-old son. Her misjudgment of the scenario plays a significant part in the narrative. Nada’s love of sunglasses becomes another weakness because it conceals all of her feelings behind the spectacles. For example, in the opening section of the novel, Richard wishes to shatter the glass into two pieces so that his mother might show him some attention. This reveals Richard’s sorrow behind his happy facade. Natashya’s fondness for worldly pleasure is a key reason for her defect in the narrative, which sadly ends her life. Natashya’s love for earthly pleasure can be expressed as an outcome of the struggles that she witnessed in her childhood days. Natashya’s disrespectful attitude toward her husband: Another problem of Natashya is her rude attitude toward her husband Elwood. Elwood and her son are used to meet her worldly desires. “She had married father the way a girl goes on a date with a man she does not like at all or even knows” (30).

Natashya and Mr. Elwood both had a difficult marriage, which significantly impacted their son Richard’s mentality. She forbids her family from reading her work and forbids them from entering her library. “Nada forbade me to look at anything of hers, of course, just as she forbade father, neither of us could enter her study” (49). This implies a sense of estrangement from her family. She had even abandoned him and Richard three times and moved in with another man for no apparent reason. Even after these experiences, Elwood’s love for his wife did not change, and he accepted her with love. But Nada’s attitude towards her family left an impression on Richard, and he eventually grew to welcome her absence from the house. He even celebrates her absence by going out with Gustave and his family.

But Elwood Everett’s love for his wife is deeper than the reader may comprehend. After discovering Natashya’s affair with Sheer in New York, he accepts her. “Your mother has left this house and is living in New York City with someone named Sheer – and we know all about him too!” (105). Their relationship deteriorated after her reunion with her spouse in Cedar Grove. She begins to live her own life. Nada declares their relationship to be amicable. This explains their relationship’s hollowness. This emptiness could be the result of their disinterest in sexual life and disagreements.

For instance, Nada disrespects Elwood in a meeting by refusing his words in front of an editor expressing her supremacy over her husband. Natashya’s vision of herself as an independent woman leads her down the path of anti-feminism. It is true that many women misunderstand the concept of feminism. Her desire to be a self-sufficient woman leads her down the wrong path, which is one of the key causes of her catastrophic collapse. Natashya’s failure as a mother: Natashya in order to present herself as an aristocratic person forces her son to enter John Behemoth Boys School. Another cause for her shortcomings is that she was unaware of Richard’s desire and never

cared about it. She makes her son take an IQ test in order for him to be admitted to the school. Unfortunately for Richard, he had a low IQ score and was rejected by Natashya. She even tells Richard to stop referring to her as a mother. Instead of soothing Richard, she displays dislike for her son. Because John Behemoth is one of Fernwood’s most prestigious schools, where all of the aristocratic families send their children to learn. Even if she claims it is for the benefit of Richards’ career, her attitude towards this occurrence has some personal significance. Finally, after passing the IQ test, Natashya lavishes Richard with affection and brings him to the park as a result of gratifying her yearning. This was the first time she had taken her son outside the house. This is one of the reasons Richard harbours ill will towards his mother.

 Natashya controls every action of Richard so that she can project herself as a higher-class society woman. While walking with her son into John Behemoth’s school she insists and pokes him to walk straighter even though it hurts him. Richard calls this incident miserable and questions whether it is his fault to be a child. Nada spends more time with people like Dean Nash and his wife and does not give importance to her own family. Her behaviour typifies aristocratic ladies in the late postwar period when they talk about cricket, politics, and other important issues in order to appear occupied in society. In order to be self-sufficient, she rejects her son three times in the narrative. He was a baby the first time, six the second time, and eleven the third time.

Following her departure from Fernwood, Richard enters her mother’s chamber and watches everything in a haphazard manner, symbolizing his mother’s muddled intellect. In her pursuit of fame and power, Nada neglects her family, which is the beginning of her downfall. Richard divides her mother into two categories.

 One who frequently rejects him and shows no regard for him. Another image he created in his imagination is of how his mother should be. Two Nadas existed – the one who was free and one who abandoned me often and the other who has become fixed irreparably in my brain, an embryonic creature of my own making, my extravagant and deranged imagination- and I loved them both, I swear it was both of them I carved. (Oates 83) Natashya’s existence in Richard’s memory is compared to an ’embryonic creature,’ which he chops down near the end of the story. Despite the fact that he believes this assignment is impossible, he assassinated her since he had no other choice. Richard frequently tells his readers that Natashya’s death will bring his book to an end, which would finally lead to his death also.

He compares Nada’s appearance to Medusa, a terrifying figure from Greek mythology. Medusa had a curse that turned any man who saw her eyes into stone; similarly, Nada’s appearance was horrifying, and Richard had no words to express her horrific vision on him. Nada’s absence in Richard’s life made his life a chaotic one psychologically, he barely had a friend and longed for love. Nada’s assumption that her son can do whatever she can, made his boyhood days miserable. For example, to demonstrate her authority over her son, she forces him to talk in French at a party given by Dean Nash. Richard becomes a puppet in Nada’s hands, and she eventually develops a loathing for her mother. Richard compares himself to a translucent piece of glass that can be easily broken into millions of pieces.

Natashya’s feelings for Richard waned following their reunion in Cedar Grove; she could not even recall how old he was. Because he was rejected by her mother for her selfishness at an early age, he began to generate a sense of irritation for her, and in the end, Nada died tragically. This is another factor that leads to the flaws of Natashya.

The post Write up on Joyce Oates’s “Expensive People appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/25/write-up-on-joyce-oatess-expensive-people/feed/ 0 7525
Write up on Tech Geek History: Chapter 2 : Pascal Record Types and Filing https://ddcomics.org/2026/09/23/write-up-on-tech-geek-history-chapter-2-pascal-record-types-and-filing/ https://ddcomics.org/2026/09/23/write-up-on-tech-geek-history-chapter-2-pascal-record-types-and-filing/#respond Wed, 23 Sep 2026 12:46:18 +0000 https://ddcomics.org/?p=7503 Chapter 2 : Pascal Record Types and Filing Significance of Study Computer program design can be made much easier by organizing information into abstract data structures (ADS). For example, one can model a table that has three columns and an indeterminate number of rows, in terms of an array with two dimensions: (1) a large […]

The post Write up on Tech Geek History: Chapter 2 : Pascal Record Types and Filing appeared first on DayDreamin’ Comics.

]]>

Chapter 2 : Pascal Record Types and Filing

Significance of Study

Computer program design can be made much easier by organizing information into abstract data structures (ADS). For example, one can model a table that has three columns and an indeterminate number of rows, in terms of an array with two dimensions:

(1) a large number of rows, and

(2) three columns.

A key feature of modern computer programs is the ability to manipulate ADS using procedures or methods that are predefined by the programmer or software designer. This requires that data structures be specified carefully, with forethought, and in detail. This section is organized as follows:

1. Arrays and their Manipulation
2. DOS Files and Turbo PASCAL
3. PASCAL File I/O Commands

1. Arrays and their Manipulation.

We begin with several observations about the use of arrays in computer programs.

  • Observation. In the early days of computer programming, machines were dedicated to the task of computing tables of artillery trajectories (WWII) and tables of accounting and business inventory information (early 1950s). Thus, numerically intensive computing machines were designed to handle linear or two-dimensional arrays. When computer programming became better established and scientific applications came into vogue, the FORTRAN (Formula Translation) language was developed which supported multiply-dimensioned arrays.

Definition. An array is a data structured whose domain is a finite subset of Euclidean n-space Rn.

Observation. Arrays in PASCAL are assigned the datatype of the elements that they contain, which can bee one and only one datatype. For example, arrays can be integer-, real-, string-, or character-valued, but elements of more than one such type cannot be contained in a PASCAL array.

Example. The vector a = (2,3,-1,5,6,0,9,-7) is a one-dimensional integer-valued array. The first value, denoted by a(1), equals 2. The i-th value in the array is denoted by a(i), i = 1..8, because there are eight elements in the array.

Example. The two-dimensional array shown below has four columns and three rows. Each element of the array is referenced by its (row,column) coordinate. For example, the element whose value equals 9.2 is in row 3, column 4, which we write as a(3,4) = 9.2 .


Figure 1. An example of a two-dimensional array.

Remark. The use of row-column indices or coordinates makes referencing elements of arrays convenient. It is especially useful to note that arrays can be indexed in loops. For example, a loop that would set all the elements of the array a in Figure 5.1 to zero could be written in pseudocode as:

         :

       DECLARE a : array [3,4] of real;

         :

       FOR i = 1 to 3 DO:

         FOR j = 1 to 4 DO:

                 a(i,j) := 0.0

               ENDFOR

       ENDFOR

and in PASCAL as:

         :

       VAR a : array [1..3,1..4] of real;

         :

       FOR i := 1 to 3 DO

         FOR j := 1 to 4 DO

                 a[i,j] := 0.0 ; ;

  • Observation. In the above PASCAL code fragment, each dimension of the array a has a lower and upper limit to the subscripts that are allowed. One finds the size of each dimension by subtracting the lower limit from the upper limit, then adding one.

Example. If an array is dimensioned as:

     VAR b : array [-2..3,5..9,4..8] of integer;

then the number of elements in the array is computed as follows:

     STEP 1: Dimension #1 is of size (3 – -2 + 1) = 6

     STEP 2: Dimension #2 is of size (9 – 5 + 1) = 5

     STEP 3: Dimension #3 is of size (8 – 4 + 1) = 5

     STEP 4: Multiply the dimension sizes: 

                      Nelements = 6 x 5 x 5 = 150

to find that there are 150 elements in the array.

In the early days of computing, it was very important to know how large arrays were, because computer memory was extremely limited. Today, with large memory models, one still must be careful not to specify array dimensions too large, but it is less of a problem than in the past.

  • Programming Hint: As we mentioned in class, one always initializes program variables to which file data is not assigned prior to computing a given expression. One can use the preceding loop structure to assign initial values to array elements in an efficient manner.

A key problem with arrays is that they have fixed size. Hence, they are called static data structures. In a more advanced class, we would examine techniques for programming data structures called lists, which can expand and contract with the data that one puts into or takes out of the list. Another problem of arrays which we mentioned previously is that they are statically typed, i.e., cannot be used to store any type of data, but only the type of data assigned to them in the VAR statement in which they were declared. It is interesting to note that certain languages, such as SNOBOL and ICON, have circumvented this difficulty by providing a TABLE data structure that can hold data of any type. You are not responsible for knowing about the TABLE data structure, however, since it is not available in PASCAL.

.2. DOS Files and Turbo PASCAL.

Turbo PASCAL supports many different types of file operations through its DOS interface, which is transparent to the user. In Section 2, we mentioned file operations such as open, read, write, and close, which we now discuss in some detail.

In order to understand file structures, it helps to think of a disk drive in terms of a drawer in a filing cabinet. In each drawer, there are many files, which are usually contained in manila folders. In order to view, create, or modify the contents of a folder, one must first retrieve then open the folder. This is similar to initializing and opening a computer disk file.

If one wants to view the file contents, then one must read the file, which holds for either physical or computer files. Similarly, creating new file contents or modifying existing file information is accomplished by writing to the file.

After one has completed operations on a given file, it is returned to the file cabinet, to keep the work area neat (this helps one find the file when it is next needed). A similar situation holds for computer disk files, where one closes the file in order to deallocate file pointers assigned by the file I/O library and runtime module.

Additional file operations, such as changing file read/write permissions are also possible. However, these are within the purview of more advanced topics, and are not part of the basic file operations reviewed in these class notes.

.3. PASCAL File I/O Commands.

The PASCAL language provides constructs for allocating or initializing, opening, reading, writing, and closing files. File addresses or references are expressed in terms of symbolic file handles, which are represented in PASCAL as names assigned to a given file. The following commands pertain:

ASSIGN statement:

Purpose: The ASSIGN statement provides a mechanism for linking a disk file to a symbolic name or file handle.

Syntax: ASSIGN( file-handle , file-pathname ) ; , where

file-handle is a name declared as type text in a VAR statement (see below)

file-pathname is a DOS pathname of the file to be referenced by file-handle

Example:

VAR handle : text ;

    :

ASSIGN(handle,’A:/PROJECTS/PROJ-2.DAT’);

    :

Notes: In the preceding example, the string constant ‘A:/PROJECTS/PROJ-2.DAT’ may be replaced by a string variable that contains the pathname. Also, the file referenced by this path must be a text file, as noted in the VAR statement that precedes the ASSIGN statement.

There are two types of file opening statements, one of which opens the file for reading (input), the other for writing (output).

RESET statement:

Purpose: The RESET statement opens a file for reading.

Syntax: RESET (file-handle) ; , where

file-handle was associated with a disk file by the ASSIGN statement

Example:

 RESET (handle);

REWRITE statement:

Purpose: The REWRITE statement opens a file for writing.

Syntax: REWRITE (file-handle) ; , where

file-handle was associated with a disk file by the ASSIGN statement

Example:

 REWRITE (handle);

PASCAL has two ways of reading or writing to a file. The READLN (or WRITELN) statement reads a sequence of characters terminated by a newline character or a carriage return, whereas the READ (WRITE) statement reads the file as a stream of characters. Since we have already covered the READLN and WRITELN statements in class, which we used to obtain input from (send output to) the computer keyboard (monitor), we herein discuss the READ and WRITE statements only. The syntax of READLN and WRITELN is symmetric to that of the READ and WRITE statements.

READ statement:

Purpose: The READ statement inputs data from the keyboard or a file as a stream of characters.

Syntax: READ ([file-handle], [I/O-list]) ; , where

file-handle was associated with a disk file by the ASSIGN statement

I/O-list is a list of variables with optional format specifiers that reference data contained in the file that is itself referenced by file-handle.

Example:

 READ (handle, a[1], letter, x, y);

Notes: If the file handle is omitted, then the Turbo PASCAL runtime module understands that the input is being taken from the computer keyboard. For those who may be C programmers or have worked with UNIX systems (versus DOS), this is called “stdin”, which is an abbreviation for “standard input”.

WRITE statement:

Purpose: The WRITE statement inputs data from the keyboard or a file as a stream of characters.

Syntax: WRITE ([file-handle], [I/O-list]) ; , where

file-handle was associated with a disk file by the ASSIGN statement

I/O-list is a list of variables with optional format specifiers that reference data contained in the file that is itself referenced by file-handle.

Example:

 WRITE (handle, a[1], letter, x, y);

Notes: If the file handle is omitted, then the Turbo PASCAL runtime module understands that the output is to be directed toward the computer monitor. For those who may be C programmers or have worked with UNIX systems (versus DOS), this is called “stdin”, which is an abbreviation for “standard input”.

CLOSE statement:

Purpose: The CLOSE statement deallocates the file handle that was activated with the ASSIGN statement, and closes the file on disk.

Syntax: CLOSE ([file-handle]) ; , where

file-handle was associated with a disk file by the ASSIGN statement

Example:

 CLOSE (handle);

Notes: The CLOSE statement has a delete option that we do not recommend for introductory users. Unfortunately, this option does not have any “safety checks”, and it is easy to delete data or programs (if you make a filename entry error) that you have spent much time on.

This concludes our summary of PASCAL file commands. Details of command usage, options, formatting, etc. will be given in class.

Pascal – File Handling

Pascal treats a file as a sequence of components which must be of uniform type. A file’s type is determined by the type of the components. File data type is defined as:

type

file-name = file of base-type;

Where, the base-type indicates the type of the components of the file. The base type could be anything like, integer, real, Boolean, enumerated, subrange, record, arrays and sets except another file type. Variables of a file type are created using the var declaration:

var

f1, f2,…: file-name;

Following are some examples of defining some file types and file variables:

type

   rfile = file of real;

   ifile = file of integer;

   bfile = file of boolean;

   datafile = file of record

   arrfile = file of array[1..4] of integer;

var

   marks: arrfile;

   studentdata: datafile;

   rainfalldata: rfile;

   tempdata: ifile;

   choices: bfile;

Creating and Writing to a File

Let us write a program that would create a data file for students’ records. It would create a file named students.dat and write a student’s data into it:

program DataFiles;

type

   StudentRecord=Record

      s_name:AnsiString;

      s_addr:AnsiString;

      s_batchcode:AnsiString;

   end;

var

   Student:StudentRecord;

   f: file;

begin

   AssignFile(f,’students.dat’);

   Rewrite(f);

   Student.s_name :=’John Smith’;

   Student.s_addr :=’United States of America’;

   Student.s_batchcode :=’Computer Science’;

   BlockWrite(f,Student,sizeof(StudentRecord));

   CloseFile(f);

end.

When compiled and run, the program would create a file named students.dat into the working directory. You can open the file using a text editor, like notepad, to look at John Smith’s data.

Reading from a File

We have just created and written into a file named students.dat. Now let us write a program that would read the student’s data from the file:

program DataFiles;

type

   StudentRecord=Record

      s_name:AnsiString;

      s_addr:AnsiString;

      s_batchcode:AnsiString;

   end;

var

   Student:StudentRecord;

   f: file;

begin

   AssignFile(f,’students.dat’);

   reset(f);

   while not eof(f) do

   begin

      Blockread(f,Student,sizeof(StudentRecord));

      writeln(‘Name: ‘,Student.s_name);

      writeln(‘Address: ‘,Student.s_addr);

      writeln(‘Batch Code: ‘,Student.s_batchcode);

   end;

   readln;       // to see the output

   closeFile(f);

end.

When the above code is compiled and executed, it produces following result:

Name: John Smith

Address: United States of America

Batch Code: Computer Science

Files as Subprogram Parameter

Pascal allows file variables to be used as parameters in standard and user defined subprograms. The following example illustrates this concept. The program creates a file named rainfall.txt, and stores some rainfall data. Next, it opens the file, reads the data and computes the average rainfall.

Please note that, if you use a file parameter with subprograms, it must be declared as a var parameter.

program addFiledata;

const

   MAX =4;

type

   raindata = file of real;

var

   rainfile: raindata;

   filename:ShortString;   

procedure writedata(var f: raindata);

var

   data: real;

   i: integer;

begin

   rewrite(f,sizeof(data));

   for i:=1 to MAX do

   begin

      writeln(‘Enter rainfall data: ‘);

      readln(data);

      write(f, data);

   end;

   closeFile(f);

end;

procedure computeAverage(var x: raindata);

var

   d, sum: real;

   average: real;

begin

   reset(x);

   sum:=0.0;

   while not eof(x) do

   begin

      read(x, d);

      sum := sum + d;

   end;

   average := sum/MAX;

   CloseFile(x);

   writeln(‘Average Rainfall: ‘, average:7:2);

   readln;  // to see the output             

end;

begin

   writeln(‘Enter the File Name: ‘);

   readln(filename);

   AssignFile(rainfile, filename);

   writedata(rainfile);

   computeAverage(rainfile);

end.

When the above code is compiled and executed, it produces following result:

Enter the File Name:

rainfall.txt

Enter rainfall data:

34

Enter rainfall data:

45

Enter rainfall data:

56

Enter rainfall data:

78

Average Rainfall: 53.25

Text Files

A text file, in Pascal, consists of lines of characters where each line is terminated with an end-of-line marker. You can declare and define such files as:

type

file-name = text;

Difference between a normal file of characters and a text file is that a text file is divided into lines, each terminated by a special end-of-line marker, automatically inserted by the system. The following example creates and writes into a text file named contact.txt:

program exText;

var

   filename, data:ShortString;

   myfile: text;

begin

   writeln(‘Enter the file name: ‘);

   readln(filename);

   AssignFile(myfile, filename);

   rewrite(myfile);

   writeln(myfile,’Note to Students: ‘);

   writeln(myfile,’For details information on Pascal Programming’);

   writeln(myfile,’Contact: Tutorials Point’);

   writeln(‘Completed writing’);

   closeFile(myfile);

end.

When the above code is compiled and executed, it produces following result:

Enter the file name:

contact.txt

Completed writing

Appending to a File

Appending to a file means writing to an existing file that already has some data without overwriting the file. The following program illustrates this:

program exAppendfile;

var

   myfile: text;

   info:ShortString;

begin

   assignFile(myfile,’contact.txt’);

   append(myfile);

   writeln(‘Contact Details’);

   writeln(‘dddd street’);

   closeFile(myfile);

   //let us read fromthis file

   AssignFile(myfile,’contact.txt’);

   reset(myfile);

   while not eof(myfile) do

   begin

      readln(myfile, info);

      writeln(info);

   end;

   CloseFile(myfile);

   readln; // to see the output

end.

In a record structure, the components (called fields) are not necessarily of the same type. In order that the type of a selected component be evident from the program text (without executing the program), a record selector is not a computable value, but instead is an identifier uniquely denoting the component to be selected. These component identifiers are declared in the record type definition. Again, the time needed to access a selected component does not depend on the selector, and the record is therefore also a random-access structure. A record type may be specified as consisting of several variants. This implies that different variables, although said to be of the same type, may assume structures which differ in a certain manner. The difference may consist of a different number and different types of components. The variant which is assumed by the current value of a record variable is indicated by a component field which is common to all variants and is called the tag field. Usually, the part common to all variants will consist of several components, including the tag field.

A file structure is a sequence of components of the same type. A natural ordering of the components is defined through the sequence. At any instance, only one component is directly accessible. The -5- other components are made accessible by progressing sequentially through the file. A file is generated by sequentially appending components at its end. Consequently, the file type definition does not determine the number of components.

Record types A record type is a structure consisting of a fixed number of components, possibly of different types. The record type definition specifies for each component, called field, its type and an identifier which denotes it. The scope of these so-called field identifiers is the record definition itself, and they are also accessible within a field designator (cf. 7.2) referring to a record variable of this type. A record type may have several variants, in which case a certain field is designated as the taq field, whose value indicates which variant is assumed by the record variable at a given time. Each variant structure is idenfified by a case label which is a constant of the type of the tag field. ::= record end |;| ‘::= {; } }: : {;} ::= : () {, } ::=

Arrays in Pascal allow the definition of variables that can contain multiple data items of the same type, but record types in Pascal are user-defined data types available in Pascal, allowing you to combine data of different kinds.

Records in Pascal consist of various fields. For instance, if you want to track the books available in a library, you can track the following attributes of each book, including:

– Book Title

– Author of the Book

– Book Classification

– Book ID

Defining Records in Pascal

To define a record in Pascal, you can use a type declaration. The record type in Pascal is defined as follows:

Below is how to declare a record type Book:

General structure for defining variables of record type in Pascal:

Declaration

r1, r2, … : record-name;

Alternatively, you can directly define variables of record type in Pascal:

Accessing Fields in Pascal Record Type

To access any fields within a record type in Pascal, we can utilize the access operator (.). The member access operator is represented by a dot between the record variable name and the field you wish to access.

Below is an example illustrating how to access fields within a Pascal record type:

When the code above is compiled and executed, it will return the following result:

Passing a Pascal Record as an Argument to a Subprogram

You can pass a Pascal record as an argument to a subprogram just like you can pass any variable or pointer.

In the example below, you can access record fields similarly to how you access them in the previous example:

When the code above is compiled and executed, it will return the following result:

Pointers in Pascal Record

You can define a pointer to a record similar to how you define pointers to any variables as shown below:

Now you can store the address of a record variable in a pointer variable defined above. To declare a pointer variable, you use the var keyword:

var

r1, r2, … : record-ptr;

Before using these pointers, you must allocate memory for a record variable, which will be manipulated by these pointers.

new(r1);

new(r2);

To access fields of a record using a pointer to that record, you must use the ^ operator as shown below:

Finally, deallocate the memory used in case the memory is no longer needed:

dispose(r1);

dispose(r2);

The example below uses a pointer to the Book record:

When the code above is compiled and executed, it will return the following result:

With Statement in Pascal Records

As mentioned above, we can access the fields of a record by using the dot operator (.). By this method, the record variable name has to be written multiple times. Therefore, using the With statement is an alternative solution in this case.

Below is an example piece of code taken from the first example:

A similar code snippet can be written using the With statement:

type
  // Declare a customer record
  TCustomer = Record
    firstName : string[20];
    lastName  : string[20];
    address1  : string[100];
    address2  : string[100];
    address3  : string[100];
    city      : string[20];
    postCode  : string[8];
  end;

var
  John, Sarah : TCustomer;

begin
  // Set up the John’s customer details
  with John do
  begin
    firstName := ‘John’;
    lastName  := ‘Smith’;
    address1  := ‘7 Park Drive’;
    address2  := ‘Branston’;
    address3  := ‘Grimworth’;
    city      := ‘Banmore’;
    postCode  := ‘BNM 1AB’;
  end;

  // Set up John’s sister similarly – simply copying the whole record
  Sarah := John;

  // And then changing the first name to suit
  Sarah.firstName := ‘Sarah’;

  // Now show the details of both customers
  with John do ShowCustomer([firstName, lastName,
                             address1, address2, address3,city,
                             postCode]);
  ShowMessage(”);
  with Sarah do ShowCustomer([firstName, lastName,
                             address1, address2, address3,city,
                             postCode]);
end;

// A procedure that displays a variable number of strings
procedure TForm1.ShowCustomer(const fields: array of string);
var
  i : Integer;

begin
  // Display all fields passed – note : arrays start at 0
  for i := 0 to Length(fields)-1 do
    ShowMessage(fields[i]);
end;

Simple Assign End Program

What is file? File is a collection of bytes that is stored on secondary storage devices like disk. There are two kinds of files in a system. They are,

 1. Text files (ASCII)

2. Binary files

· Text files contain ASCII codes of digits, alphabetic and symbols.

 · Binary file contains collection of bytes (0’s and 1’s).

 Binary files are compiled version of text files. Basic file operations in C programming: There are 4 basic operations that can be performed on any files in C programming language. They are,

1. Opening/Creating a file

 2. Closing a file

3. Reading a file

4. Writing in a file C provides a number of functions that helps to perform basic file operations. Following are the functions, Function description fopen() create a new file or open a existing file fclose() closes a file getc() reads a character from a file putc() writes a character to a file fscanf() reads a set of data from a file fprintf() writes a set of data to a file getw() reads a integer from a file putw() writes a integer to a file fseek() set the position to desire point File Handling in C Language

2 Asst. Prof. P. M. Patil

Opening a File or Creating a File fopen() function is used to open a file to perform operations such as reading, writing etc. In a C program, we declare a file pointer and use fopen() as below.

 fopen() function creates a new file if the mentioned file name does not exist.FILE *fp; General Syntax : *fp = FILE *fopen(const char *filename, const char *mode); fp=fopen (“filename”, ”mode”); Where, fp – file pointer to the data type “FILE”. filename – the actual file name with full path of the file. mode – refers to the operation that will be performed on the file. Example: r, w, a, r+, w+ and a+. Please refer below the description for these mode of operations. Closing a file fclose() function closes the file that is being pointed by file pointer fp. In a C program, we close a file as below.

 General Syntax : int fclose(FILE *fp); fclose (fp); fprintf() fprintf() function writes string into a file pointed by fp. In a C program, we write string into a file as below. General Syntax : int fprintf(FILE *fp, const char *format, …); e.g. fprintf (fp, “some data”); Mode of operations performed on a file mode description r opens a text file in reading mode w opens or create a text file in writing mode. a opens a text file in append mode r+ opens a text file in both reading and writing mode File Handling in C Language

 3 Asst. Prof. P. M. Patil w+ opens a text file in both reading and writing mode a+ opens a text file in both reading and writing mode

wb opens or create a binary file in writing mode ab opens a binary file in append mode rb+ opens a binary file in both reading and writing mode wb+ opens a binary file in both reading and writing mode ab+ opens a binary file in both reading and writing mode Input/Output operation on File // Program to write

5 names in File and read from file and display on screen. #include #include void main() { FILE *fp; char name[30]; int i; clrscr(); fp=fopen(“test.txt”,”a+”); for(i=0;i # include main() { FILE *fp; char ch; fp = fopen(“one.txt”, “w”); printf(“Enter data”); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen(“one.txt”, “r”); while( (ch = getc(fp)! = EOF) printf(“%c”,ch); fclose(fp); } Reading and Writing from File using fprintf() and fscanf() #include #include struct emp { char name[10]; int age; }; void main() { struct emp e;

p = fopen(“one.txt”, “a”); q = fopen(“one.txt”, “r”); printf(“Enter Name and Age”); scanf(“%s %d”, e.name, &e.age); fprintf(p,”%s %d”, e.name, e.age); fclose(p); do { fscanf(q,”%s %d”, e.name, e.age); printf(“%s %d”, e.name, e.age); } while( !feof(q) ); getch(); } In this program, we have create two FILE pointers and both are referring to the same file but in different modes. fprintf() function directly writes into the file, while fscanf() reads from the file, which can then be printed on console usinf standard printf() function. //Program to copy data from one file to another file //read data from file one.txt and copy into file one.txt #include #include void main() { FILE *fp1,*fp2; char name[30]; clrscr(); fp1=fopen(“test.txt”,”r”); fp2=fopen(“one.txt”,”w”); while(!feof(fp1)) { fscanf(fp1,”%s”,name); fprintf(fp2,”%s”,name); } } :- For o/p open file one.txt in TC

A file is a container in computer storage devices used for storing data.


Why files are needed?

  • When a program is terminated, the entire data is lost. Storing in a file will preserve your data even if the program terminates.
  • If you have to enter a large number of data, it will take a lot of time to enter them all.
    However, if you have a file containing all the data, you can easily access the contents of the file using a few commands in C.
  • You can easily move your data from one computer to another without any changes.

Types of Files

When dealing with files, there are two types of files you should know about:

  1. Text files
  2. Binary files

1. Text files

Text files are the normal .txt files. You can easily create text files using any simple text editors such as Notepad.

When you open those files, you’ll see all the contents within the file as plain text. You can easily edit or delete the contents.

They take minimum effort to maintain, are easily readable, and provide the least security and takes bigger storage space.

2. Binary files

Binary files are mostly the .bin files in your computer.

Instead of storing data in plain text, they store it in the binary form (0’s and 1’s).

They can hold a higher amount of data, are not readable easily, and provides better security than text files.


File Operations

In C, you can perform four major operations on files, either text or binary:

  1. Creating a new file
  2. Opening an existing file
  3. Closing a file
  4. Reading from and writing information to a file

Working with files

When working with files, you need to declare a pointer of type file. This declaration is needed for communication between the file and the program.

FILE *fptr;


Opening a file – for creation and edit

Opening a file is performed using the fopen() function defined in the stdio.h header file.

The syntax for opening a file in standard I/O is:

ptr = fopen(“fileopen”,”mode”);

For example,

fopen(“E:\\cprogram\\newprogram.txt”,”w”);

fopen(“E:\\cprogram\\oldprogram.bin”,”rb”);

  • Let’s suppose the file newprogram.txt doesn’t exist in the location E:\cprogram. The first function creates a new file named newprogram.txt and opens it for writing as per the mode ‘w’.
    The writing mode allows you to create and edit (overwrite) the contents of the file.
  • Now let’s suppose the second binary file oldprogram.bin exists in the location E:\cprogram. The second function opens the existing file for reading in binary mode ‘rb’.
    The reading mode only allows you to read the file, you cannot write into the file.
Opening Modes in Standard I/O
ModeMeaning of ModeDuring Inexistence of file
rOpen for reading.If the file does not exist, fopen() returns NULL.
rbOpen for reading in binary mode.If the file does not exist, fopen() returns NULL.
wOpen for writing.If the file exists, its contents are overwritten.
If the file does not exist, it will be created.
wbOpen for writing in binary mode.If the file exists, its contents are overwritten.
If the file does not exist, it will be created.
aOpen for append.
Data is added to the end of the file.
If the file does not exist, it will be created.
abOpen for append in binary mode.
Data is added to the end of the file.
If the file does not exist, it will be created.
r+Open for both reading and writing.If the file does not exist, fopen() returns NULL.
rb+Open for both reading and writing in binary mode.If the file does not exist, fopen() returns NULL.
w+Open for both reading and writing.If the file exists, its contents are overwritten.
If the file does not exist, it will be created.
wb+Open for both reading and writing in binary mode.If the file exists, its contents are overwritten.
If the file does not exist, it will be created.
a+Open for both reading and appending.If the file does not exist, it will be created.
ab+Open for both reading and appending in binary mode.If the file does not exist, it will be created.

Closing a File

The file (both text and binary) should be closed after reading/writing.

Closing a file is performed using the fclose() function.

fclose(fptr);

Here, fptr is a file pointer associated with the file to be closed.


Reading and writing to a text file

For reading and writing to a text file, we use the functions fprintf() and fscanf().

They are just the file versions of printf() and scanf(). The only difference is that fprintf() and fscanf() expects a pointer to the structure FILE.


Example 1: Write to a text file

#include <stdio.h>

#include <stdlib.h>

int main()

{

   int num;

   FILE *fptr;

   // use appropriate location if you are using MacOS or Linux

   fptr = fopen(“C:\\program.txt”,”w”);

   if(fptr == NULL)

   {

      printf(“Error!”);  

      exit(1);            

   }

   printf(“Enter num: “);

   scanf(“%d”,&num);

   fprintf(fptr,”%d”,num);

   fclose(fptr);

   return 0;

}

This program takes a number from the user and stores in the file program.txt.

After you compile and run this program, you can see a text file program.txt created in C drive of your computer. When you open the file, you can see the integer you entered.


Example 2: Read from a text file

#include <stdio.h>

#include <stdlib.h>

int main()

{

   int num;

   FILE *fptr;

   if ((fptr = fopen(“C:\\program.txt”,”r”)) == NULL){

       printf(“Error! opening file”);

       // Program exits if the file pointer returns NULL.

       exit(1);

   }

   fscanf(fptr,”%d”, &num);

   printf(“Value of n=%d”, num);

   fclose(fptr);

   return 0;

}

This program reads the integer present in the program.txt file and prints it onto the screen.

If you successfully created the file from Example 1, running this program will get you the integer you entered.

Other functions like fgetchar(), fputc() etc. can be used in a similar way.


Reading and writing to a binary file

Functions fread() and fwrite() are used for reading from and writing to a file on the disk respectively in case of binary files.


Writing to a binary file

To write into a binary file, you need to use the fwrite() function. The functions take four arguments:

  1. address of data to be written in the disk
  2. size of data to be written in the disk
  3. number of such type of data
  4. pointer to the file where you want to write.

fwrite(addressData, sizeData, numbersData, pointerToFile);


Example 3: Write to a binary file using fwrite()

#include <stdio.h>

#include <stdlib.h>

struct threeNum

{

   int n1, n2, n3;

};

int main()

{

   int n;

   struct threeNum num;

   FILE *fptr;

   if ((fptr = fopen(“C:\\program.bin”,”wb”)) == NULL){

       printf(“Error! opening file”);

       // Program exits if the file pointer returns NULL.

       exit(1);

   }

   for(n = 1; n < 5; ++n)

   {

      num.n1 = n;

      num.n2 = 5*n;

      num.n3 = 5*n + 1;

      fwrite(&num, sizeof(struct threeNum), 1, fptr);

   }

   fclose(fptr);

   return 0;

}

In this program, we create a new file program.bin in the C drive.

We declare a structure threeNum with three numbers – n1, n2 and n3, and define it in the main function as num.

Now, inside the for loop, we store the value into the file using fwrite().

The first parameter takes the address of num and the second parameter takes the size of the structure threeNum.

Since we’re only inserting one instance of num, the third parameter is 1. And, the last parameter *fptr points to the file we’re storing the data.

Finally, we close the file.


Reading from a binary file

Function fread() also take 4 arguments similar to the fwrite() function as above.

fread(addressData, sizeData, numbersData, pointerToFile);


Example 4: Read from a binary file using fread()

#include <stdio.h>

#include <stdlib.h>

struct threeNum

{

   int n1, n2, n3;

};

int main()

{

   int n;

   struct threeNum num;

   FILE *fptr;

   if ((fptr = fopen(“C:\\program.bin”,”rb”)) == NULL){

       printf(“Error! opening file”);

       // Program exits if the file pointer returns NULL.

       exit(1);

   }

   for(n = 1; n < 5; ++n)

   {

      fread(&num, sizeof(struct threeNum), 1, fptr);

      printf(“n1: %d\tn2: %d\tn3: %d\n”, num.n1, num.n2, num.n3);

   }

   fclose(fptr);

   return 0;

}

In this program, you read the same file program.bin and loop through the records one by one.

In simple terms, you read one threeNum record of threeNum size from the file pointed by *fptr into the structure num.

You’ll get the same records you inserted in Example 3.


Getting data using fseek()

If you have many records inside a file and need to access a record at a specific position, you need to loop through all the records before it to get the record.

This will waste a lot of memory and operation time. An easier way to get to the required data can be achieved using fseek().

As the name suggests, fseek() seeks the cursor to the given record in the file.


Syntax of fseek()

fseek(FILE * stream, long int offset, int whence);

The first parameter stream is the pointer to the file. The second parameter is the position of the record to be found, and the third parameter specifies the location where the offset starts.

Different whence in fseek()
WhenceMeaning
SEEK_SETStarts the offset from the beginning of the file.
SEEK_ENDStarts the offset from the end of the file.
SEEK_CURStarts the offset from the current location of the cursor in the file.

Example 5: fseek()

#include <stdio.h>

#include <stdlib.h>

struct threeNum

{

   int n1, n2, n3;

};

int main()

{

   int n;

   struct threeNum num;

   FILE *fptr;

   if ((fptr = fopen(“C:\\program.bin”,”rb”)) == NULL){

       printf(“Error! opening file”);

       // Program exits if the file pointer returns NULL.

       exit(1);

   }

   // Moves the cursor to the end of the file

   fseek(fptr, -sizeof(struct threeNum), SEEK_END);

   for(n = 1; n < 5; ++n)

   {

      fread(&num, sizeof(struct threeNum), 1, fptr);

      printf(“n1: %d\tn2: %d\tn3: %d\n”, num.n1, num.n2, num.n3);

      fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);

   }

   fclose(fptr);

   return 0;

}

This program will start reading the records from the file program.bin in the reverse order (last to first) and prints it.

Records and structs

A record is a package of variables, possibly of different types. Each variable is a field of the record.  In C language, records are called structs, a shorthand for structure.

Table of contents:

Definition and manipulation of structs

The following example declares (that is, creates) a record  x  with three fields that can be used to store calendar dates:

struct {

   int day;

   int month;

   int year;

} x;

It is a good ideia to give a name to the class of all records of a given kind. In our example, the name dmy seems appropriate:

struct dmy {

   int day;

   int month;

   int year;

};

struct dmy x;  // a record x of the dmy kind

struct dmy y;  // a record y of the dmy kind

To refer to a field of a record, just write the name of the record and the name of the field separated by a period:

x.day = 31;

x.month = 12;

x.year = 2020;

Records can be treated as a new data type. After the following definition, for example, we can begin saying date in place of struct dmy:

typedef struct dmy date;

date x, y;

Example.  The following function computes the end date of an event upon receiving the beginning date of the event and its duration in days.

date eventend (date beginnig, int duration) {

   date end;

   . . .

   . . .

   end.day = …

   end.month = …

   end.year = …

   return end;

}

Introduction

Persistent data hierarchies typically consist of databases composed of files, which consist of records, which consist of fields, which consist of bytes, which are stored in bits. In files that hold a tabular structure, each record contains the same number of fields.

This chapter describes how to identify records and fields in a text file and how to retrieve tabular data.

Records

A record occupies a single line in a text file and holds all of the data associated with one chunk of information. The record is a sequence of characters that ends with a record delimiter. The typical record delimiter is the newline character (\n).

Consider a text file named produce.txt containing information about items of produce in a grocery store. Each record consists of the SKU for a product and its unit price.

4664 1.49
4419 1.29
4011 0.59

To determine the number of records in this file, we count the number of newline (‘\n’) characters:

// Number of Records
// records.c

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    int c, nrecs;

    fp = fopen(“produce.txt”, “r”);

    if (fp != NULL)
    {
        nrecs = 0;
        do {
            c = fgetc(fp);

            if (c != EOF)
            {
                if ((char)c == ‘\n’)
                nrecs++;
            }
        } while (feof(fp) == 0);

        printf(“%d records on file\n”, nrecs);
        fclose(fp);
    }

    return 0;
}

The above program produces the following output:

3 records on file

note

Since this program determines the number of records in the file by counting the newline characters, to report the correct number of records, the last record in the file must end with a newline character. If the last record does not end with a newline character, the count will be off by one.

Fields

A field holds one element of information within a single record. We separate adjacent fields within a record by a field delimiter.

Consider the file named produce.txt (see above). Each record contains two fields: the first field holds the SKU and the second field holds the unit price. The field delimiter is a blank character.

The following program reads the fields of each record in the file and displays their contents:

// Record and Fields
// recordFields.c

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    int sku;
    double price;

    fp = fopen(“produce.txt”, “r”);

    if (fp != NULL)
    {
        printf(” Produce Items\n”
        ” =============\n\n”
        “SKU       Price\n”
        “—————\n”);

        while (fscanf(fp,”%d%lf\n”, &sku, &price) == 2)
        {
            printf(“%4d %10.2lf\n”, sku, price);
        }

        fclose(fp);
    }

    return 0;
}

The above program produces the following output:

 Produce Items
 =============

SKU       Price
—————
4664       1.49
4419       1.29
4011       0.59

Tables

A table is a set of records in which each record contains the same number of fields.

danger

If one of the fields in a record is a character field, the blank character might not be suitable as a field delimiter and we select a special character for that purpose.

Consider the file named sale.txt (its contents are listed below). Each record in this file contains three fields:

  1. SKU
  2. price status (a single character where a blank character represents the regular price and * represents a sale)
  3. unit price

The field delimiter is the semi-colon character (;):

The following program reads each record from the file and displays the fields in a tabular format:

// Tabular Data
// table.c

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    int sku;
    char status;
    double price;

    fp = fopen(“sale.txt”,”r”);

    if (fp != NULL)
    {
        printf(” Produce Items\n”
        ” =============\n\n”
        “SKU  Sale  Price\n”
        “—————-\n”);

        while (fscanf(fp, “%d;%c;%lf”, &sku, &status, &price) == 3)
        {
            printf(“%4d %c %8.2lf\n”, sku, status, price);
        }

        fclose(fp);
    }

    return 0;
}

The above program produces the following output:

 Produce Items
 =============

SKU  Sale  Price
—————-
4664 *      1.49
4419 *      1.29
4011        0.59

The post Write up on Tech Geek History: Chapter 2 : Pascal Record Types and Filing appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/23/write-up-on-tech-geek-history-chapter-2-pascal-record-types-and-filing/feed/ 0 7503
Write up on Tech Geek History : Fortran Programming Language: Overall Semantics of the Programming Language https://ddcomics.org/2026/09/22/write-up-on-tech-geek-history-fortran-programming-language-overall-semantics-of-the-programming-language/ https://ddcomics.org/2026/09/22/write-up-on-tech-geek-history-fortran-programming-language-overall-semantics-of-the-programming-language/#respond Tue, 22 Sep 2026 16:35:47 +0000 https://ddcomics.org/?p=7498 Background of Study The Fortran programming language is a popular choice among researchers and scientists due to its ability to interface with other programming languages and efficiently handle large datasets and perform numerical computations. Fortran’s widespread use in fields such as computational fluid dynamics, climate modeling, materials science, astrophysics, and geophysics demonstrates its versatility and […]

The post Write up on Tech Geek History : Fortran Programming Language: Overall Semantics of the Programming Language appeared first on DayDreamin’ Comics.

]]>

Background of Study

The Fortran programming language is a popular choice among researchers and scientists due to its ability to interface with other programming languages and efficiently handle large datasets and perform numerical computations.

Fortran’s widespread use in fields such as computational fluid dynamics, climate modeling, materials science, astrophysics, and geophysics demonstrates its versatility and effectiveness. The language has undergone significant revisions since its inception in 1957, with the latest revision being Fortran 2018, which includes features such as derived type constructors and improved support for parallel processing.

The continued development and refinement of Fortran ensure that it will remain a valuable tool for many years to come. The Fortran Forum, established by the International Organization for Standardization (ISO), is responsible for maintaining and updating the Fortran standard, leading to significant improvements in the language.

History Of Fortran Development

The Fortran programming language was first developed in the late 1950s by a team of scientists at IBM, led by John Backus. The name “Fortran” is an acronym for “FORmula TRANslating,” which reflects its primary purpose as a compiler for mathematical and scientific applications (Backus et al., 1953). Initially designed to simplify the process of writing and executing complex numerical calculations, Fortran was intended to be a more efficient and user-friendly alternative to existing programming languages.

The first version of Fortran, known as Fortran I, was released in 1957. It introduced several innovative features, including the use of arithmetic expressions as statements, which allowed for more concise and readable code (Backus et al., 1953). However, it was the second version, Fortran II, that gained widespread acceptance among scientists and engineers due to its improved performance and expanded capabilities.

Fortran II, released in 1958, added support for subroutines, which enabled programmers to reuse code and improve program modularity (Backus et al., 1953). This feature proved particularly useful in scientific computing, where complex simulations often required the execution of multiple, related calculations. The introduction of subroutines also facilitated the development of more sophisticated numerical methods, such as linear algebra and differential equations.

The success of Fortran II led to the creation of subsequent versions, including Fortran III and Fortran IV . These updates further expanded the language’s capabilities, introducing features like input/output operations and improved data types. However, it was the release of Fortran 66 in 1966 that marked a significant milestone in the language’s development.

Fortran 66 introduced several key improvements, including support for character strings, improved arithmetic expressions, and enhanced control structures (ANSI X3.9-1966). These changes made Fortran more versatile and easier to use, contributing to its widespread adoption across various scientific disciplines. The success of Fortran 66 also paved the way for subsequent versions, including Fortran 77 and Fortran 90 .

Fortran’s continued evolution has ensured its relevance in modern high-performance computing applications, such as climate modeling, materials science, and astrophysics. Despite the emergence of newer programming languages like C++ and Python, Fortran remains a popular choice among scientists due to its efficiency, reliability, and extensive libraries.

First Release And Early Adoption

The Fortran Programming Language was first developed in the 1950s by a team of scientists at IBM, led by John Backus. The name “Fortran” is an acronym for “FORmula TRANslating,” which reflects its primary purpose as a language for translating mathematical formulas into machine code (Backus et al., 1953). Initially designed to simplify the process of writing and executing numerical computations on large-scale computers, Fortran quickly gained popularity among scientists and engineers due to its efficiency and ease of use.

One of the key features that contributed to Fortran’s success was its ability to handle complex mathematical operations with ease. The language introduced several innovative concepts, including the use of arrays and subroutines, which allowed programmers to write more efficient and modular code (Curtis, 1970). Additionally, Fortran’s syntax was designed to be simple and intuitive, making it accessible to a wide range of users, from novice programmers to experienced scientists.

Fortran’s impact on the field of scientific computing cannot be overstated. It played a crucial role in many landmark projects, including the development of the first weather forecasting models and the simulation of nuclear reactions (Metropolis et al., 1953). The language also enabled researchers to tackle complex problems that were previously unsolvable, such as the solution of partial differential equations and the analysis of large datasets.

The widespread adoption of Fortran led to the creation of a large community of users and developers. This community drove the evolution of the language, with new features and improvements being added over time (Kuck et al., 1972). As a result, Fortran remained a popular choice for scientific computing well into the 1980s, even as other languages, such as C and Pascal, began to gain traction.

Despite its eventual decline in popularity, Fortran’s legacy continues to be felt in the field of scientific computing. Many modern programming languages, including C++ and Python, have borrowed features and concepts from Fortran (Stroustrup, 1991). Furthermore, the language’s impact on the development of high-performance computing and numerical analysis cannot be overstated.

Key Features And Syntax Rules

The Fortran Programming Language is a general-purpose, high-performance language that has been widely used in scientific computing for over five decades. Developed by IBM in the early 1950s, Fortran was designed to be efficient and easy to use for numerical computations, particularly in fields such as physics, engineering, and mathematics.

One of the key features of Fortran is its ability to handle complex mathematical operations with ease. The language supports a wide range of data types, including integers, floating-point numbers, and complex numbers, making it an ideal choice for scientific simulations and modeling. Additionally, Fortran’s syntax allows for efficient use of memory and processing power, making it well-suited for large-scale computations.

Fortran has undergone several revisions since its initial release, with the most recent version being Fortran 2008. This revision introduced a number of new features, including support for object-oriented programming, generic programming, and improved interoperability with other languages. Despite the rise of newer languages such as C++ and Python, Fortran remains widely used in many fields, particularly in high-performance computing and numerical simulations.

The language’s popularity can be attributed to its efficiency, reliability, and ease of use. Many scientific libraries and frameworks have been developed specifically for Fortran, making it a popular choice among researchers and scientists. Furthermore, the availability of compilers and development tools has made it relatively easy to get started with Fortran programming.

Fortran’s impact on the field of high-performance computing cannot be overstated. The language has played a significant role in many groundbreaking scientific discoveries, including the simulation of complex systems, the modeling of weather patterns, and the analysis of large datasets. As a result, Fortran continues to be an essential tool for scientists and researchers around the world.

Array Operations And Data Structures

Fortran, short for FORmula TRANslating system, is a general-purpose, compiled, imperative programming language that is primarily used for numerical and scientific computing. The language has undergone significant changes since its inception in the 1950s, with the latest standard being Fortran 2018. Array operations are an essential part of Fortran programming, allowing developers to efficiently manipulate large datasets.

Array operations in Fortran are based on the concept of arrays as first-class citizens. This means that arrays can be manipulated directly using various intrinsic functions and operators. For example, the SUM function can be used to calculate the sum of all elements in an array, while the MAXVAL function returns the maximum value in an array. These operations are typically performed on entire arrays at once, making them much faster than equivalent operations on individual elements.

One of the key features of Fortran’s array operations is its support for vectorized operations. This allows developers to perform operations on entire arrays as a single operation, rather than iterating over each element individually. Vectorization is particularly useful when working with large datasets, as it can significantly improve performance. For example, the WHERE function can be used to select elements from an array based on a condition, while the MERGE function combines two arrays into one.

Fortran’s array operations also support advanced features such as broadcasting and reshaping. Broadcasting allows developers to perform operations on arrays with different shapes by replicating values along a specified dimension. Reshaping, on the other hand, changes the shape of an array without altering its contents. These features are particularly useful when working with complex data structures.

In addition to these features, Fortran’s array operations also support various intrinsic functions for statistical analysis and linear algebra. For example, the MEAN function calculates the mean value of an array, while the CORRELATION function computes the correlation coefficient between two arrays. These functions are typically used in conjunction with other array operations to perform complex data analysis tasks.

Fortran’s array operations have been widely adopted in various fields, including scientific computing, numerical analysis, and engineering. The language has been used in numerous high-performance computing applications, such as weather forecasting, fluid dynamics, and materials science. Its ability to efficiently manipulate large datasets makes it an ideal choice for many computational tasks.

Matrix Multiplication And Linear Algebra

Matrix multiplication is a fundamental operation in linear algebra, used to combine two matrices into a single matrix. This process involves multiplying the elements of each row of the first matrix by the corresponding elements of each column of the second matrix. The resulting matrix has the same number of rows as the first matrix and the same number of columns as the second matrix.

The order in which the matrices are multiplied is crucial, as it affects the resulting matrix. In general, if we have two matrices A and B with dimensions m x n and p x q respectively, the product AB will have dimensions m x q, while BA will have dimensions p x n. This property is known as the associativity of matrix multiplication.

One of the key properties of matrix multiplication is that it is distributive over addition. This means that if we have three matrices A, B, and C with the same dimensions, then A(B + C) = AB + AC. This property can be used to simplify complex matrix expressions and make them easier to compute.

Matrix multiplication has numerous applications in science and engineering, including linear transformations, eigendecomposition, and singular value decomposition. It is also a fundamental tool for solving systems of linear equations and performing least squares regression analysis. In addition, matrix multiplication plays a crucial role in many machine learning algorithms, such as neural networks and support vector machines.

The computational complexity of matrix multiplication depends on the dimensions of the matrices involved. For two square matrices A and B with dimension n x n, the number of multiplications required to compute AB is O(n^3). This makes matrix multiplication a computationally expensive operation for large matrices, especially when using traditional algorithms like the standard matrix multiplication algorithm.

Input Output And File Handling

The Input/Output (I/O) operations in the Fortran programming language are used to read data from files, devices, or user input and write data to these locations. This is a fundamental aspect of any programming language, allowing users to interact with their programs and exchange information.

Fortran’s I/O system is based on streams, which can be thought of as channels through which data flows. These streams are categorized into three types: unit numbers, file units, and logical units. Unit numbers are integers that identify a specific stream, while file units refer to physical files on disk or other storage devices. Logical units, on the other hand, represent abstract streams that can be used for communication between programs.

The most common way to perform I/O operations in Fortran is through the use of formatted and unformatted input/output statements. Formatted I/O allows users to specify the format of the data being read or written, including the precision and width of numeric values and the length of character strings. Unformatted I/O, by contrast, transfers data without any formatting, often used for binary files.

Fortran’s I/O system also supports direct access to files through the use of file pointers. File pointers allow users to position themselves at specific locations within a file, enabling efficient reading or writing of large datasets. This feature is particularly useful in scientific computing and other applications where massive amounts of data need to be processed.

In addition to these features, Fortran’s I/O system includes various intrinsic functions for manipulating and formatting data during input/output operations. These functions can perform tasks such as converting between different numeric formats, padding or truncating strings, and performing arithmetic operations on data being read or written.

Control Flow Statements And Loops

The Fortran programming language is a general-purpose, compiled language that was first developed in the 1950s by a team of researchers at IBM, led by John Backus. The name “Fortran” is an acronym for “FORmula TRANslating system.” It was designed to be efficient and easy to use for scientific and engineering applications, particularly those involving numerical computations.

One of the key features of Fortran is its ability to handle complex mathematical operations and data structures. It has a strong focus on performance and efficiency, making it well-suited for high-performance computing applications such as weather forecasting, fluid dynamics, and materials science simulations. The language also supports parallel processing and distributed memory architectures, which allows it to scale to large-scale computations.

Fortran’s syntax is based on a simple, procedural programming model, with a focus on readability and ease of use. It has a small set of keywords and a straightforward structure, making it easy for programmers to learn and use. The language also supports a range of data types, including integers, floating-point numbers, and character strings.

Despite its age, Fortran remains widely used in the scientific community today, particularly in fields such as physics, chemistry, and engineering. Many popular scientific libraries and frameworks, such as NumPy and SciPy for Python, have been built on top of Fortran code or use it as a backend language. The language’s performance and efficiency make it an attractive choice for computationally intensive tasks.

The latest version of the Fortran standard, Fortran 2018, was released in 2018 and includes features such as improved support for parallel processing, enhanced data types, and better integration with other programming languages. It also provides a range of tools and libraries for building high-performance applications.

Functions And Subroutines In Fortran

Functions in Fortran are blocks of code that perform specific tasks, such as calculations or input/output operations. They are typically defined within a program and can be reused throughout the code (IBM, 2020). Functions in Fortran can take arguments, which are values passed to the function when it is called, and return values, which are the results of the function’s execution (Fortran Forum, 2018).

Subroutines in Fortran are similar to functions but do not return a value. Instead, they perform an action or set of actions and then return control to the calling program (IBM, 2020). Subroutines can also take arguments and use them within their code. However, unlike functions, subroutines do not have a return statement and instead rely on the program’s flow to exit the subroutine.

The syntax for defining functions in Fortran involves using the FUNCTION keyword followed by the name of the function (Fortran Forum, 2018). The function’s arguments are listed within parentheses, and the function’s body is defined within the END FUNCTION statement. For example: FUNCTION add(a, b) RESULT(c) would define a function named add that takes two arguments a and b and returns their sum.

Subroutines in Fortran are defined using the SUBROUTINE keyword followed by the name of the subroutine (IBM, 2020). The subroutine’s arguments are listed within parentheses, and the subroutine’s body is defined within the END SUBROUTINE statement. For example: SUBROUTINE print_message(message) would define a subroutine named print_message that takes one argument message and prints it to the console.

In terms of best practices for using functions and subroutines in Fortran, it is generally recommended to keep them short and focused on a specific task (Fortran Forum, 2018). This makes the code easier to read and maintain. Additionally, functions and subroutines should be well-documented with clear comments explaining their purpose and usage.

Functions and subroutines can also be used in combination with other Fortran features such as modules and interfaces to create more complex programs (IBM, 2020).

Object-oriented Programming In Fortran

Fortran is a general-purpose, procedural programming language that was first developed in the 1950s by a team of researchers at IBM, led by John Backus (Backus et al., 1953). The name “Fortran” is an acronym for “FORmula TRANslating system.” Fortran was designed to be efficient and easy to use for scientific and engineering applications, particularly in the fields of physics, chemistry, and mathematics.

One of the key features of Fortran is its ability to handle complex mathematical calculations and data manipulation. The language has a strong focus on numerical computation and is often used for tasks such as linear algebra, differential equations, and statistical analysis (Carnahan et al., 1969). Fortran’s syntax is also designed to be easy to read and write, with a simple and consistent structure that makes it well-suited for large-scale scientific simulations.

In the context of Object-Oriented Programming (OOP), Fortran has traditionally been considered a procedural language, meaning that it does not support the key features of OOP such as encapsulation, inheritance, and polymorphism. However, with the introduction of modern Fortran standards such as Fortran 2003 and Fortran 2018, the language has begun to incorporate some OOP concepts (Cooper et al., 2015). For example, Fortran 2003 introduced the concept of modules, which can be used to encapsulate data and procedures in a way that is similar to object-oriented programming.

Despite these advances, Fortran remains largely a procedural language at its core. The language’s focus on numerical computation and data manipulation means that it is often used for tasks such as linear algebra and statistical analysis, where the emphasis is on efficient execution rather than complex data structures (Press et al., 2007). However, this does not mean that Fortran cannot be used for OOP-style programming. In fact, many modern Fortran compilers and libraries provide support for OOP concepts such as classes and objects.

One area where Fortran has begun to incorporate OOP concepts is in the use of modules and interfaces (Cooper et al., 2015). For example, the Fortran 2003 standard introduced the concept of a module interface, which can be used to define a set of procedures and variables that are accessible from outside the module. This allows for a degree of encapsulation and modularity in Fortran programming, which is similar to the OOP concept of object-oriented programming.

Fortran’s use of modules and interfaces has also led to the development of new libraries and frameworks that provide support for OOP-style programming (Cooper et al., 2015). For example, the OpenACC standard provides a way to write parallel code in Fortran that is similar to the OOP concept of polymorphism. This allows developers to write code that can be executed on multiple processors or GPUs, which is an important feature for many scientific and engineering applications.

Interfacing With Other Languages And Tools

The Fortran programming language is a general-purpose, compiled language that has been widely used in scientific and engineering applications for over five decades. Developed by IBM in the late 1950s, Fortran was designed to be efficient and easy to use for numerical computations, particularly in fields such as physics, chemistry, and engineering.

Fortran’s syntax is characterized by its use of explicit type declarations, which allow programmers to specify the data type of variables at compile time. This approach enables compilers to optimize code execution and reduce memory usage, making Fortran a popular choice for applications requiring high performance and efficiency. The language also features a range of built-in functions and subroutines for numerical computations, including linear algebra operations, statistical analysis, and random number generation.

One of the key strengths of Fortran is its ability to interface with other programming languages and tools. For example, the Fortran 90 standard introduced the concept of modules, which allow programmers to encapsulate code and data into reusable units that can be easily integrated with other languages. This feature has enabled Fortran to be used in conjunction with languages such as C, C++, and Python, allowing developers to leverage the strengths of each language for specific tasks.

Fortran’s interface capabilities have also been extended through the use of libraries and frameworks, which provide a range of pre-built functions and tools for tasks such as data visualization, file input/output, and parallel processing. The Message Passing Interface (MPI) library, for example, provides a standardized way to communicate between processes in parallel computing environments, allowing Fortran programs to scale efficiently on large-scale systems.

The use of Fortran has been widespread across various fields, including climate modeling, computational fluid dynamics, and materials science. Many scientific simulations rely heavily on Fortran code, which is often optimized for performance and efficiency. The language’s ability to interface with other tools and languages has also enabled it to be used in conjunction with more modern programming languages, such as Python and Julia, for tasks such as data analysis and visualization.

Fortran’s continued relevance in the scientific computing community can be attributed to its ability to provide high-performance execution, efficient memory usage, and a range of built-in functions for numerical computations. The language’s interface capabilities have also enabled it to be used in conjunction with other languages and tools, making it a versatile choice for a wide range of applications.

Performance Optimization Techniques

Fortran’s performance optimization techniques are crucial for achieving high computational efficiency, particularly in scientific simulations and data-intensive applications. One key technique is the use of compiler directives, such as !$omp parallel and !$omp critical, to explicitly specify parallelization and synchronization points (Kuck et al., 1981). These directives allow developers to fine-tune the execution of loops and functions, thereby maximizing concurrency and minimizing overhead.

Another essential aspect is memory management. Fortran’s array operations can be optimized by using contiguous memory allocation, which reduces memory access latency and improves cache locality (Carnahan et al., 1969). This can be achieved through the use of allocatable arrays or by employing compiler-specific options, such as -Mcache for Intel Fortran Compiler.

In addition to these techniques, Fortran developers often employ loop optimization strategies, including loop unrolling and fusion. Loop unrolling involves expanding loops into multiple iterations, which can improve cache utilization and reduce branch misprediction penalties (Smith et al., 1985). Loop fusion, on the other hand, combines adjacent loops into a single iteration, thereby reducing overhead associated with loop control structures.

Furthermore, Fortran’s performance optimization is also influenced by the choice of numerical libraries and algorithms. The use of optimized libraries, such as BLAS and LAPACK, can significantly improve computational efficiency (Dongarra et al., 1996). Additionally, selecting appropriate algorithms for specific problems, such as linear algebra or eigenvalue decomposition, can also impact performance.

The integration of parallelization techniques with memory management and loop optimization strategies is critical for achieving optimal performance in Fortran. By combining these approaches, developers can create efficient and scalable code that takes full advantage of modern computing architectures (Gropp et al., 1999).

Modern Fortran Standards And Updates

The Modern Fortran Standards and Updates are governed by the Fortran Forum, a committee established by the International Organization for Standardization (ISO). The Fortran Forum is responsible for maintaining and updating the Fortran standard, which has undergone significant revisions since its inception in 1957.

The first major revision of the Fortran standard was published in 1966 as Fortran IV. This version introduced several new features, including the use of subroutines and the ability to read and write data from files. The next major revision, Fortran 77, was published in 1978 and added support for character strings and the use of common blocks.

Fortran 90, released in 1990, introduced a significant number of new features, including the use of modules, derived types, and the ability to perform operations on arrays. This version also included improved support for input/output operations and the use of pointers. The Fortran 95 standard, published in 1997, built upon the features introduced in Fortran 90 and added support for the use of allocatable arrays.

The latest revision of the Fortran standard is Fortran 2003, released in 2004. This version includes a number of significant new features, including the use of generic interfaces, the ability to perform operations on derived types, and improved support for parallel processing. The Fortran 2008 standard, published in 2010, built upon the features introduced in Fortran 2003 and added support for the use of coarrays.

The current version of the Fortran standard is Fortran 2018, released in 2018. This version includes a number of significant new features, including the use of derived type constructors, the ability to perform operations on allocatable arrays, and improved support for parallel processing.

Applications And Use Cases For Fortran

Fortran is widely used in the field of computational fluid dynamics for simulating complex fluid flows, such as those found in aerospace engineering and oceanography. The language’s ability to efficiently handle large datasets and perform numerical computations makes it an ideal choice for this type of research (Baker et al., 2017; Kohnke & Sorensen, 2008). For example, the OpenFOAM software, which is a widely used CFD tool, has its core functionality written in Fortran.

In addition to computational fluid dynamics, Fortran is also commonly used in the field of climate modeling. The language’s ability to handle large datasets and perform complex numerical computations makes it an ideal choice for simulating global climate patterns (Taylor et al., 2012; Washington & Meehl, 2007). Many climate models, such as the Community Earth System Model (CESM), have been written in Fortran.

The use of Fortran in scientific computing extends beyond these fields to include many other areas, such as astrophysics and geophysics. The language’s ability to efficiently handle large datasets and perform numerical computations makes it an ideal choice for simulating complex systems (Hawkins et al., 2016; Jones & Lee, 2009). Many scientific simulations, such as those used in the study of black holes and galaxy evolution, have been written in Fortran.

Fortran’s ability to efficiently handle large datasets and perform numerical computations makes it an ideal choice for many areas of scientific computing. The language’s widespread use in fields such as computational fluid dynamics, climate modeling, materials science, astrophysics, and geophysics demonstrates its versatility and effectiveness (Baker et al., 2017; Kohnke & Sorensen, 2008).

Introduction to Numerical Methods and Fortran Programming introduction to numerical methods and fortran programming opens the door to a fascinating intersection of mathematics and computer science. Whether you’re a student, researcher, or professional engineer, understanding how numerical methods work and how Fortran programming can be leveraged to implement these methods is invaluable. This combination enables the solving of complex mathematical problems that are otherwise intractable through analytical means. In this article, we’ll explore the basics of numerical methods, the role Fortran plays in scientific computing, and how these two worlds come together to tackle real-world challenges.

What Are Numerical Methods?

Numerical methods are algorithms used to approximate solutions for mathematical problems that cannot be solved exactly or would be too time-consuming to solve analytically. These methods are essential in fields such as physics, engineering, finance, and computer science, where models often involve complicated differential equations, integrals, or algebraic systems. Unlike symbolic mathematics, which seeks exact solutions, numerical methods provide approximate answers with controllable error margins. This makes them incredibly powerful for simulations, optimizations, and solving equations numerically.

Common Types of Numerical Methods

There are several categories of numerical methods, each tailored for different types of problems:

  • Root-finding algorithms: Methods like the bisection method, Newton-Raphson, and secant method are used to find zeros of functions.
  • Numerical integration and differentiation: Techniques such as trapezoidal rule, Simpson’s rule, and finite difference methods approximate integrals and derivatives.
  • Solving linear and nonlinear systems: Algorithms like Gaussian elimination, LU decomposition, and iterative methods help solve systems of equations.
  • Ordinary differential equations (ODEs): Euler’s method, Runge-Kutta methods, and multistep methods approximate solutions to differential equations.
  • Optimization methods: Gradient descent and simplex method optimize functions under constraints.

Understanding these methods lays the foundation for implementing them efficiently in programming environments.

The Importance of Fortran in Numerical Computing

When discussing an introduction to numerical methods and Fortran programming, it’s impossible to overlook Fortran’s historical and ongoing significance in scientific computing. Developed in the 1950s, Fortran (short for “Formula Translation”) is one of the oldest high-level programming languages, specifically designed for numerical and scientific computations.

Why Choose Fortran?

Despite the emergence of many modern programming languages, Fortran remains favored in high-performance scientific computing for several reasons:

  • Performance: Fortran compilers are highly optimized for numerical calculations, enabling fast execution of compute-intensive tasks.
  • Array handling: Fortran’s native support for multi-dimensional arrays makes it intuitive for matrix and vector operations, a staple in numerical methods.
  • Legacy code and libraries: A vast repository of tested numerical libraries and legacy codebases exist in Fortran, providing reusable, reliable tools.
  • Parallel computing support: Modern Fortran versions include features for parallelism, crucial for handling large-scale simulations.

These factors make Fortran an excellent choice for implementing algorithms that require precision and speed.

Integrating Numerical Methods with Fortran Programming

Once you understand numerical methods and become familiar with Fortran programming, the next step is using Fortran to implement these algorithms. This practical approach is what enables scientists and engineers to solve complex problems efficiently.

Getting Started with Fortran for Numerical Methods

For beginners, it’s helpful to start by writing simple programs that demonstrate numerical concepts. For example, implementing the Newton-Raphson method to find roots of a function or using Simpson’s rule for numerical integration. Here are some tips to keep in mind:

  • Modular programming: Break your code into subroutines and functions to handle different parts of the algorithm, ensuring cleaner and reusable code.
  • Use built-in array operations: Leverage Fortran’s powerful array features for efficient data manipulation.
  • Precision management: Fortran allows specifying different precision levels (single, double) which is critical for controlling numerical accuracy.
  • Testing and validation: Always verify your numerical results against analytical or known solutions to ensure correctness.

Example: Solving a System of Linear Equations

One common numerical method is solving Ax = b, where A is a matrix and b is a vector. Fortran makes this straightforward with built-in numerical libraries like LAPACK. Here’s a simplified approach:

  1. Define matrix A and vector b.
  2. Use LU decomposition routines to factorize A.
  3. Solve for x using forward and backward substitution.
  4. Output the solution vector x.

Working through such examples helps solidify the connection between numerical theory and practical programming.

Modern Developments in Fortran and Numerical Methods

While Fortran’s roots are deeply traditional, the language has evolved significantly. Modern Fortran (Fortran 90/95/2003 and beyond) introduces object-oriented features, dynamic memory allocation, and interoperability with C, making it more versatile and accessible. Similarly, numerical methods continue to advance with adaptive algorithms, error estimation techniques, and high-performance parallel computing. Combining these innovations with Fortran’s efficiency allows researchers to push the boundaries of computational science.

Learning Resources and Tools

If you’re interested in diving deeper, consider exploring:

  • Fortran compilers: GNU Fortran (gfortran), Intel Fortran Compiler
  • Numerical libraries: LAPACK, BLAS, IMSL, and Netlib repositories
  • Textbooks: “Numerical Recipes” series, “Introduction to Numerical Analysis” by Stoer and Bulirsch
  • Online tutorials and forums: Websites like Stack Overflow, Fortran Wiki, and specialized numerical computing communities

These resources provide practical guidance and community support essential for mastering both numerical methods and Fortran programming.

Why Combining Numerical Methods and Fortran Programming Matters

The synergy between numerical methods and Fortran programming offers a powerful toolkit for tackling problems that are otherwise impossible to solve analytically. From climate modeling and computational fluid dynamics to financial risk analysis and structural engineering simulations, the ability to write efficient numerical algorithms in Fortran accelerates innovation and discovery. Moreover, learning this combination enhances your problem-solving skills, deepens your understanding of applied mathematics, and prepares you for roles in academia, industry, or research labs that rely heavily on computational modeling. As you embark on your journey into numerical methods and Fortran programming, remember that patience and practice are key. Start with simple algorithms, gradually tackle more complex problems, and leverage the rich ecosystem of Fortran tools and libraries. Over time, you’ll find that what once seemed like abstract mathematical concepts become tangible solutions implemented through elegant and efficient code.

Introduction to Numerical Methods and Fortran Programming: The Cornerstone of Computational Science

Numerical methods represent the bridge between abstract mathematical theory and the practical execution of solutions in real-world engineering, physics, finance, and data science. At their core, numerical methods are algorithmic strategies designed to approximate solutions to problems that are analytically intractable or computationally intensive. From solving differential equations that model fluid dynamics to optimizing financial portfolios, numerical methods enable the simulation, prediction, and optimization essential in modern science and industry. Fortran, a legacy programming language with deep roots in high-performance computing, remains unparalleled in executing these numerical algorithms efficiently at scale. This article delivers an ultra-comprehensive exploration of numerical methods and Fortran programming, detailing their historical evolution, mathematical foundations, implementation mechanics, real-world applications, comparative advantages, common pitfalls, and future trajectories—positioning readers to master this critical domain with authoritative precision.

The Evolution and Historical Significance of Numerical Methods

Numerical methods trace their origins to ancient civilizations attempting to solve equations, approximate areas under curves, and model celestial motion. However, the formal discipline emerged during the 19th and early 20th centuries, driven by the need to solve large-scale physical problems where analytical solutions were impractical. Pioneers such as Carl Friedrich Gauss, Leonhard Euler, and Isaac Newton laid early groundwork with iterative and approximation techniques. The advent of electronic computers in the mid-20th century catalyzed explosive growth in numerical methods, enabling large matrix computations, differential equation solvers, and optimization routines. Fortran, developed by IBM in the 1950s under the leadership of John Backus, was explicitly designed to meet these needs. Its syntax prioritized mathematical expressiveness, array operations, and efficient machine-level execution, making it ideal for scientific computing. Over decades, Fortran evolved through standards (Fortran 77, 90, 95, 2003, 2008, 2018), integrating modern features while preserving backward compatibility—ensuring its enduring relevance in high-performance numerical applications.

Core Concepts and Fundamentals of Numerical Methods

At its essence, numerical methods transform continuous mathematical problems into discrete, solvable forms using algorithms governed by well-defined convergence properties. The central challenge lies in balancing accuracy, stability, and computational efficiency. Key foundational principles include:

Discretization: Continuous domains (e.g., space, time) are approximated via grids, meshes, or finite elements. This transforms differential equations into algebraic systems solvable on digital computers. Approximation Theory: Polynomial interpolation, splines, and Taylor expansions enable function approximation. Error analysis quantifies truncation and round-off errors, critical for reliability. Iterative Techniques: Methods such as Newton-Raphson, Gauss-Seidel, and conjugate gradients converge toward solutions through successive refinements, especially for large sparse systems. Stability and Convergence: Algorithms must ensure errors do not amplify uncontrollably; convergence guarantees validate long-term solution fidelity. Conditioning and Sensitivity: Problem conditioning determines how input perturbations affect output—ill-conditioned systems require specialized conditioning or robust solvers.

These principles underpin core numerical paradigms including root-finding, numerical integration, differential equation solving, optimization, and Monte Carlo simulation—each tailored to distinct classes of problems.

Major Categories of Numerical Methods and Their Mathematical Foundations

Numerical methods are categorized based on problem type and solution approach. Understanding these domains enables strategic selection and implementation:

1. Root-Finding Algorithms

Root-finding algorithms locate values of x such that f(x) = 0. These are foundational in engineering design, control systems, and optimization. Key methods include:

Bisection Method: Reliable but slow; iteratively narrows intervals bracketing a root using midpoint evaluation. Guaranteed convergence in finite steps if sign change exists. Newton-Raphson Method: Quadratic convergence when initial guesses are close; leverages first-order Taylor approximation. Requires smooth, differentiable functions and non-zero derivative. Secant Method: Derivative-free alternative to Newton-Raphson; uses finite differences between points to approximate slope, offering faster convergence than bisection without derivative computation. Fixed-Point Iteration: Rewrites equations as x = g(x); convergence depends on contraction mapping conditions (|g’(x)| < 1 in neighborhood).

2. Numerical Integration and Quadrature

Numerical integration approximates definite integrals ∫ab f(x)dx when analytical evaluation is impractical. Core techniques include:

Trapezoidal Rule: Approximates area under curve via trapezoids; first-order accurate, but improved by composite methods. Simpson’s Rule: Uses parabolic arcs for better accuracy (fourth-order convergence); requires even subintervals. Gaussian Quadrature: Selects optimal node points and weights to maximize accuracy; exact for polynomials up to degree 2n−1 with n nodes; highly efficient for smooth integrands. Monte Carlo Integration: Employs random sampling for high-dimensional integrals; probabilistic convergence with O(1/√n) error, ideal for complex geometries.

3. Solving Systems of Linear Equations

Linear systems Ax = b arise in discretized PDEs, circuit analysis, and optimization. Efficient solvers balance speed and memory:

Direct Methods: Gaussian elimination, LU/Cholesky decomposition with known convergence; ideal for dense, well-conditioned matrices. Pivoting strategies mitigate numerical instability. Iterative Methods: Jacobi, Gauss-Seidel, SOR (Successive Over-Relaxation), and Krylov subspace methods (GMRES, Conjugate Gradient). Convergence depends on spectral properties; preconditioning accelerates progress.

4. Nonlinear Equation Systems and Optimization

Solving systems nonlinear f(x) = 0 and minimizing/maximizing functions define nonlinear numerical analysis. Critical approaches include:

Newton’s Method for Systems: Extends scalar Newton-Raphson via Jacobian matrices; quadratic convergence if initial guess is near solution. Quasi-Newton Methods (BFGS, L-BFGS): Approximate Jacobians to reduce computational cost, enabling scalability to thousands of variables. Nonlinear Programming: Sequential Quadratic Programming (SQP), interior-point methods, and gradient descent variants optimize constrained and unconstrained problems across engineering design, machine learning, and operations research.

5. Ordinary and Partial Differential Equation Solvers

PDEs govern continuum mechanics, electromagnetics, fluid flow, and heat transfer. Numerical strategies include:

Finite Difference Methods (FDM): Approximates derivatives via Taylor expansions on structured grids; straightforward but limited to regular domains. Finite Element Methods (FEM): Uses variational formulations and basis function expansions; excels in complex geometries and multiphysics simulations. Finite Volume Methods (FVM): Preserves conservation laws via integral forms; dominant in CFD and compressible flow simulations. Spectral Methods: Expands solutions in orthogonal bases (Fourier, Chebyshev); high accuracy for smooth problems but less flexible in handling discontinuities.

Real-World Applications Across Disciplines

Numerical methods underpin transformative technologies across domains:

Aerospace Engineering: CFD simulations using FVM solve Navier-Stokes equations to optimize aircraft aerodynamics, predict turbulence, and reduce drag. Climate Modeling: Global circulation models integrate partial differential equations over 3D grids to simulate atmospheric and oceanic dynamics, informing climate policy and disaster preparedness. Financial Modeling: Stochastic differential equations (SDEs) solved via Monte Carlo and finite difference methods price derivatives, assess risk, and optimize trading strategies in quantitative finance. Machine Learning: Gradient-based optimization and linear algebra intensive in training deep neural networks; numerical stability and scalability directly impact model performance. Structural Engineering: FEM evaluates stress, strain, and failure modes in bridges and skyscrapers under dynamic loads using nonlinear material models and large deformations.

Fortran’s Architectural Advantages for High-Performance Numerical Computing

Fortran remains the lingua franca of high-performance scientific computing due to deliberate design choices optimized for numerical workloads:

Mathematical Expressiveness: Native support for arrays, subscripts, and mathematical notation preserves algorithmic clarity and reduces translation overhead. Performance Optimization: Fortran’s static typing, predictable memory layouts, and efficient compilation enable compilers (e.g., Intel Fortran, GCC) to generate highly optimized machine code with minimal runtime overhead. Legacy Compatibility and Stability: Backward-compatible language evolution ensures existing codebases remain functional across compiler versions, reducing migration risks in long-term scientific projects. Parallel and Distributed Computing Support: Fortran integrates standard parallel constructs (OpenMP directives, MPI interface) enabling scalable execution on multi-core, GPU-accelerated, and supercomputing clusters. Native Support for Scientific Libraries: Fortran interfaces seamlessly with high-performance libraries (LAPACK, BLAS, PETSc, SLEPc) providing battle-tested linear solvers and solvers for elliptic PDEs.

Modern Fortran Standards and Their Impact on Numerical Programming

Each Fortran standard has advanced numerical capabilities:

Fortran 90/95: Introduced modules, dynamic memory, and improved array syntax, enabling modular, maintainable code essential for large-scale simulations.

Fortran 2003: Added object-oriented programming (OOP) constructs, enabling encapsulation and abstraction in numerical libraries; enhanced interface handling improved reliability.

Fortran 2008: Introduced coarrays for parallel programming, along with improved interfaces and generic programming, strengthening concurrency and code reuse.

Fortran 2018: Expanded parallelism support, introduced intrinsic parallel features (e.g., enhancements), improved precision control (default double precision), and refined input/output for scientific data, enabling robust, portable, and high-performance numerical applications.

Best Practices in Fortran for Numerical Methods Development

Effective Fortran programming for numerical computation follows disciplined patterns:

Use Modular Design: Encapsulate algorithms into modules with clear interfaces to promote reuse, testing, and maintainability. Optimize Array Operations: Leverage intrinsic array syntax and compiler auto-vectorization to exploit SIMD and GPU acceleration without sacrificing readability. Manage Memory Efficiently: Prefer static allocation where possible; use dynamic allocation judiciously to avoid fragmentation and latency. Leverage Compiler Optimization Flags: Enable -O3, -xFortran-OpenMP, and -march=native to maximize performance on target hardware. Implement Robust Error Handling: Use statements with descriptive messages and exception handling for numerical stability—critical in long-running simulations. Profile and Benchmark: Utilize profiling tools (e.g., Intel VTune, gprof) to identify bottlenecks; optimize hot paths using vectorization, loop unrolling, and cache-aware algorithms.

Common Pitfalls and Myths in Numerical Methods and Fortran Implementation

Despite its strengths, numerical computing in Fortran is fraught with misunderstandings:

Myth: “Fortran is obsolete.” Reality: Fortran powers 70%+ of supercomputing codebases (e.g., Weather Research and Forecasting model, LAMMPS molecular dynamics); its performance and stability remain unmatched. Myth: “Numerical methods are only for experts.” Reality: Modern tools (e.g., Fortran-based frameworks like FEniCS, OpenFOAM, and PiTiS) lower entry barriers; domain scientists increasingly use Fortran through high-level interfaces and domain-specific languages built atop. Myth: “More precision always improves accuracy.” Reality: Ill-conditioned problems suffer from catastrophic cancellation; adaptive precision, error estimation, and robust solvers often outperform brute-force double-precision computation. Myth: “Parallel code runs instantaneously.” Reality: Scalability is limited by Amdahl’s Law and communication overhead; Amdahl-aware algorithm design and efficient parallel patterns (e.g., domain decomposition) are essential.

Advanced Strategies for Optimizing Numerical Performance in Fortran

Maximizing computational throughput in Fortran numerical applications demands multi-layered optimization:

Algorithmic Optimization: Reduce arithmetic intensity, minimize memory access, and exploit problem symmetry or sparsity. Compiler-Level Tuning: Use profile-guided optimization (PGO), link with optimized math libraries (BLAS, LAPACK, MAGMA), and enable auto-vectorization via or . Numerical Preconditioning: Apply domain-specific preconditioners (e.g., multigrid, incomplete LU) to accelerate iterative solvers, reducing iteration counts significantly. Hybrid Parallelism: Combine MPI with OpenMP or CUDA to leverage distributed and shared memory architectures, achieving near-peak performance on heterogeneous systems. Cache Optimization: Reorder computations to improve spatial and temporal locality; use blocking and tiling to fit data in cache, reducing costly

From War Rooms to Supercomputers: The Deep Origins and Evolution of Numerical Methods and Fortran Programming

The story of numerical methods and Fortran programming is not merely a chronicle of technical innovation—it is a mirror reflecting the geopolitical tensions, economic imperatives, and intellectual upheavals of the 20th and 21st centuries. At its roots lies a Cold War imperative: the urgent need to solve complex physical problems too intricate for analytical solutions alone. Numerical methods—algorithms for approximating solutions to differential equations, eigenvalue problems, optimization, and stochastic processes—emerged not as abstract mathematics, but as essential tools of national defense, energy security, and industrial competitiveness. Fortran, born in the early 1950s at IBM, became the first high-level programming language designed explicitly for scientific computation. Together, they forged a computational paradigm that reshaped engineering, physics, climate science, and finance. Yet their trajectory is marked by tensions: between open collaboration and proprietary control, between human-readable code and machine efficiency, and between legacy systems and exascale futures. This article traces their evolution from wartime necessity to global infrastructure, exposing the deep forces that shaped them—and those still shaping their future.

The Birth of Numerical Methods in the Wartime Crucible

The genesis of modern numerical methods is inseparable from World War II. By the 1940s, military planners faced problems too vast for hand calculation: ballistic trajectories, nuclear chain reactions, fluid dynamics around aircraft, and radar wave propagation. Mathematicians at institutions like Los Alamos, Cambridge, and MIT recognized that the only viable path forward was algorithmic—systematic, repeatable, and executable with mechanical calculators. The need was not theoretical; it was existential. As mathematician John von Neumann later wrote, “We could not have beaten the enemy without solving the equations of motion for high-speed projectiles.” This urgency birthed numerical analysis as a discipline, with pioneers like Richard Courant, John von Neumann, and Kurt Friedrichs developing finite difference methods, implicit solvers, and stability analysis. These methods transformed differential equations from intractable puzzles into programmable processes—laying the conceptual foundation for what would become Fortran.

The Genesis of Fortran: From Subroutines to Syntax

In 1954, IBM engineer John Backus led a team tasked with turning numerical algorithms into executable code. At the time, programming was an artisanal craft—each computer required custom assembly, with no abstraction between mathematical formula and machine instruction. Backus’s vision was radical: a language where a scientist could write a loop or a matrix operation without worrying about binary registers or word boundaries. Fortran—short for “Formula Translation”—emerged from this insight. Its first version, Fortran I (1957), introduced labels, arrays, and subroutines—structures that allowed reusable, modular computation. But more than syntax, Fortran encoded a paradigm: numerical computation as symbolic translation, where human logic was first expressed, then compiled into machine-executable sequences. This abstraction was revolutionary. It democratized access to high-performance computing, enabling physicists, engineers, and mathematicians to focus on problem-solving rather than machine details.

The Cold War Economy and the Institutionalization of Computation

Fortran’s rise coincided with the geopolitical escalation of the Cold War. The U.S. defense establishment poured resources into research labs, universities, and contractors, with computation as a strategic asset. The Manhattan Project’s success had already demonstrated the power of numerical simulation; by the 1950s, the race to build thermonuclear weapons and intercontinental ballistic missiles demanded ever more sophisticated modeling. Fortran became the lingua franca of this ecosystem. At IBM, Backus and his team refined the language, introducing array syntax (1958), intrinsic functions, and optimized compilation. But Fortran was not just a tool—it was a geopolitical instrument. The U.S. government funded computing centers at

QuestionAnswer
What is the importance of numerical methods in scientific computing?Numerical methods are essential in scientific computing because they provide techniques to obtain approximate solutions to complex mathematical problems that cannot be solved analytically, enabling the simulation and analysis of real-world phenomena.
Why is Fortran still used for numerical methods programming?Fortran remains popular for numerical methods due to its efficiency in handling array operations, numerical precision, extensive libraries for scientific computing, and legacy codebases in engineering and physics.
What are some common numerical methods introduced in an introductory course?Common numerical methods include root-finding algorithms (like bisection and Newton-Raphson), numerical integration (trapezoidal and Simpson’s rule), numerical differentiation, and solving linear systems (Gaussian elimination).
How does Fortran handle arrays and why is this beneficial for numerical computing?Fortran has built-in support for multi-dimensional arrays with efficient memory layout and operations, which simplifies implementation of numerical algorithms that rely heavily on matrix and vector computations.
What are the basic steps to write a Fortran program for a numerical method?The basic steps include defining the problem, initializing variables, implementing the numerical algorithm (loops and conditionals), performing computations, and outputting the results, all within Fortran’s program structure.
How do numerical errors affect computations in numerical methods?Numerical errors such as round-off and truncation errors can accumulate and affect the accuracy and stability of computations, so understanding and minimizing these errors is crucial in numerical methods.
Can you explain the Newton-Raphson method and its implementation in Fortran?The Newton-Raphson method is an iterative root-finding algorithm that uses function values and derivatives to approximate roots. In Fortran, it can be implemented using loops to update guesses until convergence criteria are met.
What role do conditional statements and loops play in Fortran programming for numerical methods?Conditional statements and loops control the flow of the program, enabling iterative algorithms and decision-making processes vital for implementing numerical methods like convergence tests and step-wise computations.
How does numerical integration differ from analytical integration, and how is it performed in Fortran?Numerical integration approximates the integral of a function using discrete sums, useful when analytical integration is difficult. In Fortran, this is done by coding algorithms like the trapezoidal or Simpson’s rule to sum function values at specified points.
What resources are recommended for beginners to learn numerical methods and Fortran programming?Recommended resources include textbooks like ‘Numerical Methods for Engineers’ by Chapra, online tutorials on Fortran programming, numerical methods courses on platforms like Coursera or edX, and official Fortran documentation.

Related keywords: numerical analysis, computational methods, Fortran language, scientific computing, numerical algorithms, programming fundamentals, error analysis, matrix computations, numerical integration, differential equations

**Introduction to Numerical Methods and Fortran Programming: A Professional Overview** introduction to numerical methods and fortran programming marks a pivotal junction for professionals engaged in scientific computing, engineering simulations, and applied mathematics. These two interconnected domains form the backbone of numerous computational tasks, enabling the solution of complex mathematical problems that are otherwise analytically intractable. As computational demands grow and precision becomes paramount, understanding the synergy between numerical algorithms and the programming languages that implement them—chiefly Fortran—becomes increasingly vital. Numerical methods encompass a broad array of algorithms designed to approximate solutions for mathematical problems such as root finding, numerical integration, differential equations, and linear algebraic systems. On the other hand, Fortran (short for “Formula Translation”) stands out as one of the oldest high-level programming languages, specifically tailored for numeric computation and scientific computing. Despite the emergence of newer programming languages, Fortran remains deeply entrenched in high-performance computing (HPC), climate modeling, fluid dynamics, and physics simulations due to its efficiency and powerful array-handling capabilities.

Exploring the Essence of Numerical Methods

Numerical methods are indispensable tools in converting mathematical theories into practical, computable solutions. Unlike symbolic mathematics, which seeks exact analytical expressions, numerical methods prioritize approximate, yet highly accurate, answers that can be computed within reasonable timeframes and resource constraints.

Core Categories of Numerical Methods

The field of numerical methods can be broadly classified into key areas:

  • Root-Finding Algorithms: Techniques like the Newton-Raphson method and bisection method locate zeros of functions that cannot be solved analytically.
  • Numerical Integration and Differentiation: Methods such as trapezoidal and Simpson’s rule approximate integrals and derivatives.
  • Linear Algebra Solvers: Algorithms like Gaussian elimination, LU decomposition, and iterative solvers address systems of linear equations.
  • Numerical Solutions of Differential Equations: Euler’s method, Runge-Kutta methods, and finite difference methods approximate solutions to ordinary and partial differential equations.

These methods are essential for engineering simulations, financial modeling, and scientific research where analytical solutions are either impossible or impractical.

Challenges and Considerations in Numerical Methods

While numerical methods offer versatility, they come with inherent trade-offs. Issues such as convergence rates, stability, accuracy, and computational complexity must be carefully balanced. For example, an algorithm with rapid convergence might be computationally intensive per iteration, while a simpler method could require more iterations to achieve the desired precision. Furthermore, round-off errors and truncation errors are persistent concerns in numerical computations. The propagation of these errors can significantly impact the reliability of results, especially in large-scale simulations or iterative processes. Therefore, numerical analysts often emphasize error estimation and adaptive algorithms that adjust parameters dynamically to optimize accuracy.

The Role of Fortran Programming in Numerical Computation

Fortran, introduced in the 1950s by IBM, was the first widely adopted high-level programming language. It was designed with a focus on numerical computation and scientific applications, distinguishing itself from general-purpose languages by providing built-in support for array operations, intrinsic mathematical functions, and efficient memory management.

Why Fortran Remains Relevant in Modern Scientific Computing

Despite the rise of languages like Python, C++, and MATLAB, Fortran retains a strong foothold in domains requiring intense numerical computations. Key reasons include:

  • Performance Optimization: Fortran compilers are highly optimized for numerical calculations, often outperforming other languages in raw speed when handling large datasets or complex arithmetic.
  • Legacy Codebase: Many scientific libraries and simulation frameworks are built on decades-old Fortran code, ensuring continued reliance and integration.
  • Array and Matrix Handling: Fortran’s native support for multi-dimensional arrays facilitates straightforward implementation of numerical algorithms.
  • Parallel Computing Capabilities: Modern Fortran standards (such as Fortran 2008 and 2018) include constructs for parallelism (coarrays, OpenMP), which are vital for HPC environments.

Fundamental Features of Fortran for Numerical Methods

Fortran’s syntax and structure are streamlined for numerical tasks: – **Strong Typing and Precision Control:** Fortran allows explicit declaration of variable types and supports various precision levels (single, double), critical for controlling numerical accuracy. – **Intrinsic Mathematical Functions:** Functions like SIN, COS, EXP, LOG, and specialized routines simplify coding complex formulas. – **Modular Programming:** Modern Fortran supports modules and user-defined types, improving code maintainability and reusability. – **Efficient I/O Operations:** Fortran’s input/output system is adept at handling large scientific datasets, facilitating data-driven simulations.

Integrating Numerical Methods with Fortran Programming

The combination of numerical methods and Fortran programming creates a powerful toolkit for tackling scientific problems. Implementing numerical algorithms in Fortran often leads to highly efficient and scalable solutions, particularly when dealing with large-scale simulations such as weather prediction models, computational fluid dynamics (CFD), and structural analysis.

Practical Applications and Industry Use Cases

In aerospace engineering, Fortran-based numerical methods enable the simulation of airflow over aircraft surfaces through solving Navier-Stokes equations. Similarly, climate scientists employ Fortran-coded numerical models to predict global warming trends by solving complex partial differential equations governing atmospheric dynamics. In computational finance, numerical methods implemented in Fortran calculate option pricing and risk assessment, leveraging its speed to perform Monte Carlo simulations and finite difference methods.

Advantages and Limitations of Using Fortran for Numerical Methods

While Fortran excels in numerical computations, it is not without drawbacks:

  • Advantages:
    • High performance with optimized compilers
    • Extensive scientific libraries and legacy code availability
    • Strong handling of array and matrix operations
    • Support for parallel computing paradigms
  • Limitations:
    • Less flexible for general-purpose programming compared to modern languages
    • Smaller community and fewer modern development tools relative to languages like Python
    • Steeper learning curve for programmers unfamiliar with its procedural style and syntax

The post Write up on Tech Geek History : Fortran Programming Language: Overall Semantics of the Programming Language appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/22/write-up-on-tech-geek-history-fortran-programming-language-overall-semantics-of-the-programming-language/feed/ 0 7498
Write up on Tech Geek History : SCALA and Metaprogramming Schema https://ddcomics.org/2026/09/22/write-up-on-tech-geek-history-scala-and-metaprogramming-schema/ https://ddcomics.org/2026/09/22/write-up-on-tech-geek-history-scala-and-metaprogramming-schema/#respond Tue, 22 Sep 2026 11:40:53 +0000 https://ddcomics.org/?p=7448 Peer to Peer Article Knowledge Based SCALA and Metaprogramming Schema  1.1 Metaprogramming by performing some operations at compile time. However, sometimes inlining is not enough and we need more powerful ways to analyze and synthesize programs at compile time. Macros enable us to do exactly this: treat programs as data and manipulate them. Macros Treat […]

The post Write up on Tech Geek History : SCALA and Metaprogramming Schema appeared first on DayDreamin’ Comics.

]]>

Peer to Peer Article

Knowledge Based

SCALA and Metaprogramming Schema

 1.1 Metaprogramming by performing some operations at compile time. However, sometimes inlining is not enough and we need more powerful ways to analyze and synthesize programs at compile time. Macros enable us to do exactly this: treat programs as data and manipulate them.

Macros Treat Programs as Values

With a macro, we can treat programs as values, which allows us to analyze and generate them at compile time.

A Scala expression with type T is represented by an instance of the type scala.quoted.Expr[T].

We will dig into the details of the type Expr[T], as well as the different ways of analyzing and constructing instances, when talking about Quoted Code and Reflection. For now, it suffices to know that macros are metaprograms that manipulate expressions of type Expr[T].

The following macro implementation prints the expression of the provided argument at compile-time in the standard output of the compiler process:

import scala.quoted.* // imports Quotes, Expr

def inspectCode(x: Expr[Any])(using Quotes): Expr[Any] =

  println(x.show)

  x

After printing the argument expression, we return the original argument as a Scala expression of type Expr[Any].

As foreshadowed in the section on Inline, inline methods provide the entry point for macro definitions:

inline def inspect(inline x: Any): Any = ${ inspectCode(‘x) }

All macros are defined with an inline def. The implementation of this entry point always has the same shape:

  • they only contain a single splice ${ … }
  • the splice contains a single call to the method that implements the macro (for example inspectCode).
  • the call to the macro implementation receives the quoted parameters (that is ‘x instead of x) and a contextual Quotes.

We will dig deeper into these concepts later in this and the following sections.

Calling our inspect macro inspect(sys error “abort”) prints a string representation of the argument expression at compile time:

scala.sys.error(“abort”)

Macros and Type Parameters

If the macro has type parameters, the implementation will also need to know about them. Just like scala.quoted.Expr[T] represents a Scala expression of type T, we use scala.quoted.Type[T] to represent the Scala type T.

inline def logged[T](inline x: T): T = ${ loggedCode(‘x)  }

def loggedCode[T](x: Expr[T])(using Type[T], Quotes): Expr[T] = …

Both the instance of Type[T] and the contextual Quotes are automatically provided by the splice in the corresponding inline method (that is, logged) and can be used by the macro implementation.

Defining and Using Macros

A key difference between inlining and macros is the way they are evaluated. Inlining works by rewriting code and performing optimisations based on rules the compiler knows. On the other hand, a macro executes user-written code that generates the code that the macro expands to.

Technically, compiling the inlined code ${ inspectCode(‘x) } calls the method inspectCode at compile time (through Java reflection), and the method inspectCode then executes as normal code.

To be able to execute inspectCode, we need to compile its source code first. As a technical consequence, we cannot define and use a macro in the same class/file. However, it is possible to have the macro definition and its call in the same project as long as the implementation of the macro can be compiled first.

1.2 Suspended Files

To allow defining and using macros in the same project, only those calls to macros that have already been compiled are expanded. For all other (unknown) macro calls, the compilation of the file is suspended. Suspended files are only compiled after all non suspended files have been successfully compiled. In some cases, you will have cyclic dependencies that will block the completion of the compilation. To get more information on which files are suspended you can use the -Xprint-suspension compiler flag.

Example: Statically Evaluating power with Macros

Let us recall our definition of power from the section on Inline that specialized the computation of xⁿ for statically known values of n.

inline def power(x: Double, inline n: Int): Double =

  inline if n == 0 then 1.0

  else inline if n % 2 == 1 then x * power(x, n – 1)

  else power(x * x, n / 2)

In the remainder of this section, we will define a macro that computes xⁿ for a statically known values x and n. While this is also possible purely with inline, implementing it with macros will illustrate a few things.

inline def power(inline x: Double, inline n: Int) =

  ${ powerCode(‘x, ‘n)  }

def powerCode(

  x: Expr[Double],

  n: Expr[Int]

)(using Quotes): Expr[Double] = …

Simple Expressions

We could implement powerCode as follows:

def pow(x: Double, n: Int): Double =

  if n == 0 then 1 else x * pow(x, n – 1)

def powerCode(

  x: Expr[Double],

  n: Expr[Int]

)(using Quotes): Expr[Double] =

  val value: Double = pow(x.valueOrAbort, n.valueOrAbort)

  Expr(value)

Here, the pow operation is a simple Scala function that computes the value of xⁿ. The interesting part is how we create and look into the Exprs.

Creating Expression From Values

Let’s first look at Expr.apply(value). Given a value of type T, this call will return an expression containing the code representing the given value (that is, of type Expr[T]). The argument value to Expr is computed at compile-time, at runtime we only need to instantiate this value.

Creating expressions from values works for all primitive types, tuples of any arity, Class, Array, Seq, Set, List, Map, Option, Either, BigInt, BigDecimal, StringContext. Other types can also work if a ToExpr is implemented for it, we will see this later.

Extracting Values from Expressions

The second method we use in the implementation of powerCode is Expr[T].valueOrAbort, which has an effect opposite to Expr.apply. It attempts to extract a value of type T from an expression of type Expr[T]. This can only succeed, if the expression directly contains the code of a value, otherwise, it will throw an exception that stops the macro expansion and reports that the expression did not correspond to a value.

Instead of valueOrAbort, we could also use the value operation, which will return an Option. This way we can report the error with a custom error message.

Reporting Custom Error Messages

The contextual Quotes parameter provides a report object that we can use to report a custom error message. Within a macro implementation method, you can access the contextual Quotes parameter with the quotes method (imported with import scala.quoted.*), then import the report object by import quotes.reflect.report.

Providing the Custom Error

We will provide the custom error message by calling errorAndAbort on the report object as follows:

def powerCode(

  x: Expr[Double],

  n: Expr[Int]

)(using Quotes): Expr[Double] =

  import quotes.reflect.report

  (x.value, n.value) match

    case (Some(base), Some(exponent)) =>

      val value: Double = pow(base, exponent)

      Expr(value)

    case (Some(_), _) =>

      report.errorAndAbort(“Expected a known value for the exponent, but was ” + n.show, n)

    case _ =>

      report.errorAndAbort(“Expected a known value for the base, but was ” + x.show, x)

Alternatively, we can also use the Expr.unapply extractor

  …

  (x, n) match

    case (Expr(base), Expr(exponent)) =>

      val value: Double = pow(base, exponent)

      Expr(value)

    case (Expr(_), _) => …

    case _ => …

The operations value, valueOrAbort, and Expr.unapply will work for all primitive types, tuples of any arity, Option, Seq, Set, Map, Either and StringContext. Other types can also work if an FromExpr is implemented for it, we will see this later.

Showing Expressions

In the implementation of inspectCode, we have already seen how to convert expressions to the string representation of their source code using the .show method. This can be useful to perform debugging on macro implementations:

def debugPowerCode(

  x: Expr[Double],

  n: Expr[Int]

)(using Quotes): Expr[Double] =

  println(

    s”powerCode \n” +

    s”  x := ${x.show}\n” +

    s”  n := ${n.show}”)

  val code = powerCode(x, n)

  println(s”  code := ${code.show}”)

  code

Working with Varargs

Varargs in Scala are represented with Seq, hence when we write a macro with a vararg, it will be passed as an Expr[Seq[T]]. It is possible to recover each individual argument (of type Expr[T]) using the scala.quoted.Varargs extractor.

import scala.quoted.* // imports `Varargs`, `Quotes`, etc.

inline def sumNow(inline nums: Int*): Int =

  ${ sumCode(‘nums)  }

def sumCode(nums: Expr[Seq[Int]])(using Quotes): Expr[Int] =

  import quotes.reflect.report

  nums match

    case Varargs(numberExprs) => // numberExprs: Seq[Expr[Int]]

      val numbers: Seq[Int] = numberExprs.map(_.valueOrAbort)

      Expr(numbers.sum)

    case _ => report.errorAndAbort(

      “Expected explicit varargs sequence. ” +

      “Notation `args*` is not supported.”, nums)

The extractor will match a call to sumNow(1, 2, 3) and extract a Seq[Expr[Int]] containing the code of each parameter. But, if we try to match the argument of the call sumNow(nums*), the extractor will not match.

Varargs can also be used as a constructor. Varargs(Expr(1), Expr(2), Expr(3)) will return an Expr[Seq[Int]]. We will see how this can be useful later.

Complex Expressions

So far, we have only seen how to construct and destruct expressions that correspond to simple values. In order to work with more complex expressions, Scala 3 offers different metaprogramming facilities ranging from

each increasing in complexity and potentially losing safety guarantees. It is generally recommended to prefer simple APIs over more advanced ones. In the remainder of this section, we introduce some more additional constructors and destructors, while subsequent chapters introduce the more advanced APIs.

Collections

We have seen how to convert a List[Int] into an Expr[List[Int]] using Expr.apply. How about converting a List[Expr[Int]] into an Expr[List[Int]]? We mentioned that Varargs.apply can do this for sequences; likewise, for other collection types, corresponding methods are available:

  • Expr.ofList: Transform a List[Expr[T]] into Expr[List[T]]
  • Expr.ofSeq: Transform a Seq[Expr[T]] into Expr[Seq[T]] (just like Varargs)
  • Expr.ofTupleFromSeq: Transform a Seq[Expr[T]] into Expr[Tuple]
  • Expr.ofTuple: Transform a (Expr[T1], …, Expr[Tn]) into Expr[(T1, …, Tn)]

Simple Blocks

The constructor Expr.block provides a simple way to create a block of code { stat1; …; statn; expr }. Its first arguments is a list with all the statements and the second argument is the expression at the end of the block.

inline def test(inline ignore: Boolean, computation: => Unit): Boolean =

  ${ testCode(‘ignore, ‘computation) }

def testCode(ignore: Expr[Boolean], computation: Expr[Unit])(using Quotes) =

  if ignore.valueOrAbort then Expr(false)

  else Expr.block(List(computation), Expr(true))

The Expr.block constructor is useful when we want to generate code contanining several side effects. The macro call test(false, EXPRESSION) will generate { EXPRESSION; true}, while the call test(true, EXPRESSION) will result in false.

Simple Matching

The method Expr.matches can be used to check if one expression is equal to another. With this method we could implement an value operation for Expr[Boolean] as follows.

def value(boolExpr: Expr[Boolean]): Option[Boolean] =

  if boolExpr.matches(Expr(true)) then Some(true)

  else if boolExpr.matches(Expr(false)) then Some(false)

  else None

It may also be used to compare two user written expression. Note, that matches only performs a limited amount of normalization and while for instance the Scala expression 2 matches the expression { 2 }, this is not the case for the expression { val x: Int = 2; x }.

Arbitrary Expressions

Last but not least, it is possible to create an Expr[T] from arbitary Scala code by enclosing it in quotes. For example, ‘{ ${expr}; true } will generate an Expr[Boolean] equivalent to Expr.block(List(expr), Expr(true)). The subsequent section on Quoted Code presents quotes in more detail.

1.3 What is a Closure in Scala?

In Scala, a closure refers to a function that captures and retains references to variables from its surrounding lexical scope even after that scope has exited. In other words, it “closes over” or encapsulates the variables, allowing them to persist within the function’s scope. Closures are a fundamental concept in functional programming languages like Scala, and they enable powerful and flexible programming techniques.

Closures have two main characteristics:

  • Encapsulation of Variables: Closures can access and manipulate variables that are defined in their containing or enclosing function, even after that function has completed execution. This behavior is possible because the closure retains a reference to those variables.
  • Independence: Closures are self-contained units of behavior, meaning they don’t rely on global or external state. Instead, they carry their own encapsulated state, making them predictable and easy to reason about.

Closures are particularly valuable in scenarios where you need to pass behavior as a parameter, such as in functional programming paradigms like map, reduce, or filter operations. They allow you to create functions on-the-fly that can use and modify variables from their enclosing scope, providing a level of flexibility and expressiveness that is essential for functional programming.

In Scala, closures are often used in conjunction with higher-order functions like map, filter, and reduce to process collections of data in a concise and elegant way. These functions take functions (closures) as arguments and apply them to each element of a collection, making it easy to perform operations like transformation, filtering, or aggregation.

A closure in Scala is a function that captures and retains references to variables from its surrounding lexical scope, allowing for powerful and flexible programming techniques. Closures are a fundamental concept in functional programming and are essential for writing expressive and concise code when working with collections and higher-order functions in Scala.

1. 5 Defining a Closure: In Scala, you can define a closure by creating a function that references variables from its outer scope. These variables are captured and retained by the closure. Here’s a simple example:

def outerFunction(x: Int): Int => Int = {

    val factor = x

    (y: Int) => y * factor // Closure captures ‘factor’

}

In this example, outerFunction takes an x as an argument and returns a function that multiplies its argument by x. The inner function (y: Int) => y * factor is a closure because it captures the factor variable from its surrounding scope. Run the above code in your editor for a better and clear explanation.

2. Using Closures: You can use closures like regular functions. In this case:

val doubler = outerFunction(2)

val result = doubler(5) // This will return 10

Here, doubler is a closure that captures factor from the outer scope, and when invoked with doubler(5), it multiplies 5 by 2 (the captured factor). Run the above code in your editor for a better and clear explanation.

2.5 Closures with Mutable Variables: Closures can also capture mutable variables. However, you need to be cautious with this, as it can lead to unexpected behavior due to shared state:

def counter(): () => Int = {

    var count = 0

    () => {

        count += 1

        count

    }

}

In this example, the closure captures the mutable count variable. Each time it’s called, it increments count. Run the above code in your editor for a better and clear explanation.

3.0 Closures in Collections: Closures are often used in Scala collections for operations like map, filter, and reduce. For instance:

val numbers = List(1, 2, 3, 4, 5)

val doubled = numbers.map(x => x * 2) // ‘x’ is a closure capturing the current element

Here, the closure (x => x * 2) is passed to map, and it captures each element of the numbers list as it iterates. Run the above code in your editor for a better and clear explanation.

Example

Here’s a simple example of a closure in Scala:

object ClosureExample {

  def main(args: Array[String]): Unit = {

    val factor = 5 // Variable from the outer scope

    // Closure that captures ‘factor’ from the outer scope

    val multiplier = (x: Int) => x * factor

    // Using the closure

    val result1 = multiplier(10) // Multiplies 10 by 5 (factor)

    val result2 = multiplier(8)  // Multiplies 8 by 5 (factor)

    println(s”Result 1: $result1″) // Output: Result 1: 50

    println(s”Result 2: $result2″) // Output: Result 2: 40

  }

}

Types of Closure Function

Closures in Scala can be categorized into two main types: pure closures and impure closures. These distinctions are fundamental in functional programming, as they describe the behavior of functions concerning side effects and referential transparency.

Pure Closures:

Pure closures, also known as pure functions or referentially transparent functions, adhere to strict functional programming principles. They are characterized by the following key attributes:

  • Encapsulation of Behavior and State: A pure closure encapsulates both behavior (in the form of a function) and the variables or data it relies on. This encapsulation ensures that the function’s behavior is context-independent and self-contained. The closure captures its lexical environment, meaning it retains references to variables in its surrounding scope. These captured variables are often referred to as “free variables.”
  • Immutable Variables: The variables captured by a pure closure are immutable. Once a variable is assigned a value, it cannot be modified. This immutability guarantees that the closure’s behavior remains consistent throughout its lifetime. Immutability also ensures that there are no unexpected side effects, making the code more predictable and easier to reason about.
  • No Side Effects: A pure closure does not produce side effects. Side effects include actions like modifying variables outside the closure’s scope, printing to the console, or performing I/O operations. In pure closures, all effects are contained within the function.
  • Referential Transparency: Referential transparency is a crucial concept in functional programming. It means that a function, given the same inputs, will always produce the same output without affecting or being affected by external factors. Pure closures exhibit referential transparency because they rely solely on their captured variables and do not depend on any external state.
  • No Dependency on Global State: A pure closure should not rely on global or mutable state. It depends only on the variables captured at the time of its creation. This characteristic ensures that the closure’s behavior remains consistent regardless of changes to global or external state.
  • First-Class Citizens: In functional programming languages, functions, including pure closures, are treated as first-class citizens. This means they can be assigned to variables, passed as arguments to other functions, returned as values, and stored in data structures. The ability to treat closures as first-class citizens allows for higher-order functions, which take closures as parameters and enable powerful abstraction and composition.
  • Lazy Evaluation: Some functional programming languages implement lazy evaluation, where functions are not evaluated until their results are actually needed. Pure closures can benefit from lazy evaluation, as they don’t introduce side effects when evaluated.
  • Deterministic Output: Given the same inputs (captured variables), a pure closure will always produce the same output. This determinism is essential for reasoning about code behavior and for achieving predictability.
  • No Dependency on External Context: A pure closure should not rely on external context, such as system time or user input. Its behavior should be solely determined by its inputs (captured variables) and parameters.
  • Testability: Pure closures are highly testable because they have no hidden dependencies or side effects. Testing pure closures involves providing specific inputs and asserting that the outputs match the expected results, making it easier to write unit tests.

Implementation

  • Deterministic Behavior: The closure (x: Int) => x * x always produces the same output (x * x) for the same input (x). Thus, it has deterministic behavior.
  • No Side Effects: The closure does not modify any external variables, perform I/O operations, or have any other side effects. It purely calculates the square of its input.
  • Immutable Data: It operates on immutable data (x is an immutable integer), and it does not modify the input.
  • Referential Transparency: The closure is referentially transparent because you can replace a call to square(x) with its result (x * x) without changing the program’s behavior.

Example:

Here’s an example of a pure closure in Scala:

def add(a: Int, b: Int): Int = a + b

The add function is pure because it takes two integers as inputs and returns their sum, without any side effects or reliance on external state. You can safely replace add(2, 3) with 5 anywhere in your code without changing the program’s behavior. Run the above code in your editor for a better and clear explanation.

Impure Closures:

Impure closures, in contrast, do not strictly adhere to the principles of functional programming. They exhibit the following characteristics:

  • Access to External State: Impure closures can access variables or data from their enclosing scope, but they often depend on variables outside of their lexical environment. This means they can introduce unexpected behavior if the external state changes.
  • Modifying External State: Unlike pure closures, which are typically side-effect-free, impure closures may modify external state. They can change the values of variables or data outside of their own scope, leading to unintended consequences in a program.
  • Non-Deterministic Behavior: Impure closures can exhibit non-deterministic behavior because their results depend on external factors. The same impure closure may produce different outcomes when executed at different points in time due to changes in external state.
  • Limited Reusability: Impure closures are often less reusable than pure closures. They may have hidden dependencies on external state that make them specific to certain contexts, making it challenging to use them in different scenarios.
  • Debugging Complexity: Debugging impure closures can be more complex. When an impure closure exhibits unexpected behavior, identifying the cause may involve tracing changes in external state, which can be challenging in large codebases.
  • Concurrency Challenges: Impure closures can lead to race conditions and other concurrency-related issues when multiple threads or processes access and modify the same external state concurrently. Managing shared state in concurrent environments can be error-prone.
  • Difficulty in Testing: Testing impure closures can be more challenging. To ensure their behavior is correct, you need to set up and manage the external state accurately, which can be complex and error-prone in itself.
  • Reduced Predictability: The use of impure closures can reduce the predictability and understandability of code. It becomes more challenging to determine how changes in one part of the program affect the behavior of impure closures elsewhere.

Implementation of impure closure function in scala

  • Declare Mutable State: Start by declaring a mutable variable or state that the impure closure will modify. This mutable state will be accessible from within the closure.
  • Create the Impure Closure: Define a function or closure that exhibits impure characteristics. This function should perform some side effects or rely on the mutable state you declared earlier.
  • Usage of the Impure Closure: Utilize the impure closure in your code as needed. Keep in mind that invoking the closure will result in side effects and potentially modify the external mutable state.
  • Exercise Caution and Documentation: When working with impure closures, exercise caution and be aware of their side effects and mutable state changes. It’s essential to document the behavior of impure closures to ensure that their usage is well-understood and controlled.

Impure closures are useful in specific scenarios where side effects or mutable state management is required, such as I/O operations or performance optimizations.

Example:

Here’s an example of implementing an impure closure function:

object ImpureClosureExample {

  var total = 0 // Mutable state

  // Impure closure function that adds a value to ‘total’ and returns it

  val addToTotal: Int => Int = (x: Int) => {

    total += x // Modifies external mutable ‘total’ state

    total // Returns the modified ‘total’

  }

  def main(args: Array[String]): Unit = {

    // Using the impure closure function

    val result1 = addToTotal(5) // Result is 5

    val result2 = addToTotal(3) // Result is 8

    println(s”Result 1: $result1″) // Output: Result 1: 5

    println(s”Result 2: $result2″) // Output: Result 2: 8

  }

}

In this example, we have created an impure closure function named addToTotal. Run the above code in your editor for a better and clear explanation. Here’s how it exhibits impure characteristics:

  • Side Effects: The addToTotal closure has side effects because it modifies the external mutable variable total as a side effect. When you call addToTotal(5), it adds 5 to the total, and when you call addToTotal(3), it further modifies the total to 8.
  • Mutable State: The variable total is mutable, and the closure modifies it, changing its value over time. This mutable state introduces non-deterministic behavior because the result of calling addToTotal depends on the current state of total.
  • Lack of Referential Transparency: This impure closure lacks referential transparency. You cannot safely replace a call to addToTotal(5) with its result because doing so would skip the side effect of updating total.

Conclusion

  • Pure and Impure: Closures can be categorized as pure or impure. Pure closures adhere to functional principles, ensuring deterministic and side-effect-free behavior, while impure closures introduce side effects and may rely on mutable state.
  • Side Effects and Mutability: Impure closures are essential for tasks involving side effects, I/O operations, or mutable state management. However, they come with increased complexity and require careful handling.
  • Optimizations: Pure closures facilitate code optimization and parallelization, as their behavior is solely determined by their inputs, allowing for more efficient execution.
  • Modularity and Reusability: Closures enhance code modularity and promote the creation of reusable components by encapsulating behavior and data.
  • Documentation and Care: Regardless of closure type, it’s crucial to document their behavior, especially when working with impure closures. Careful consideration of when and where to use closures ensures code clarity and mainta

The post Write up on Tech Geek History : SCALA and Metaprogramming Schema appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/22/write-up-on-tech-geek-history-scala-and-metaprogramming-schema/feed/ 0 7448
Write up on After Ninety Years: A Newly Translated 1880 Serbian Vampire Novella https://ddcomics.org/2026/09/21/write-up-on-after-ninety-years-a-newly-translated-1880-serbian-vampire-novella/ https://ddcomics.org/2026/09/21/write-up-on-after-ninety-years-a-newly-translated-1880-serbian-vampire-novella/#respond Mon, 21 Sep 2026 19:09:06 +0000 https://ddcomics.org/?p=7475 Significance of Study After Ninety Years: A Newly Translated 1880 Serbian Vampire Novella After Ninety Years: The Story of Serbian Vampire Sava Savanovic is a Serbian novella by Milovan Glisic, first published in 1880. Glisic was a Serbian translator, author, and dramaturg; he translated many authors into Serbian, including Jules Verne and Edgar Allan Poe, who both […]

The post Write up on After Ninety Years: A Newly Translated 1880 Serbian Vampire Novella appeared first on DayDreamin’ Comics.

]]>

Significance of Study

After Ninety Years: A Newly Translated 1880 Serbian Vampire Novella

After Ninety Years: The Story of Serbian Vampire Sava Savanovic is a Serbian novella by Milovan Glisic, first published in 1880. Glisic was a Serbian translator, author, and dramaturg; he translated many authors into Serbian, including Jules Verne and Edgar Allan Poe, who both wrote about Gothic themes themselves. It’s noteworthy that this novel was published seventeen years before Dracula, not because it influenced Stoker, since it wasn’t translated into English until 2015, but because it depicts vampire elements that are not the conventional ones Stoker popularized; rather, Glisic’s novella draws on folklore and is more true to the original vampire tradition as a result. After Ninety Years has now been translated into English for the first time by James Lyon, himself the author of the vampire novel Kiss of the Butterfly, which is set in the Balkans and explores Vlad Tepes’ time there.

The book contains both a note from the translator that talks about the translation and Serbian vampire literature and an introduction by Andrew Boylan that discusses the novella, how it differs from Dracula, and also how it compares to the film based on it—Leptirica by Đorđe Kadijević, made in 1973.

The story is not long and fairly simple. There is a village in Serbia in which a wealthy man, Zivan, who is the kmet (mayor or leader) of the village has a beautiful daughter named Radojka. A young man, Strahinja, is in love with Radojka, but Zivan refuses to let Strahinja marry her. Zivan’s anger causes Strahinja to leave the village. He ends up going to the neighboring town where the villagers are having a serious problem. They have no miller and whenever they get one, he is found dead in the mill the next day, usually with a red mark around his throat as if he had been hung. (At this point, the villagers do not realize they are up against a vampire. It’s significant that there is no mention of bite marks on the victim’s neck. Instead, the vampire seems to suck out his victims’ blood simply by touching them; unfortunately, the novel is not gruesome enough to show us the vampire preying on his victim, so it’s left somewhat unclear how he satisfies his bloodthirst). Strahinja decides he will play miller to solve this mystery. He hides up on the mill’s loft with two pistols to see what might threaten him.

Enter the vampire. He comes into the mill and Strahinja can see he is a tall man with a face as red as blood and over his shoulder he carries a shroud which stretches down to his heels. (A footnote here explains that in Serbian tradition, the vampire lies in his death shroud and if he loses it, he loses his power. One wonders whether this is why vampires are often depicted with capes in English literature—perhaps a misunderstanding of the death shroud.) The vampire then says out loud to himself, “Oh, Sava Savanović! For 90 years you’ve been a vampire, and you’ve never gone without supper as you have this evening!” This statement explains the novel’s title. Strahinja needs no more information than to know his enemy is a vampire before he decides to shoot him. When the smoke from the pistols clears, the vampire is gone.

Strahinja goes to the other villagers, who are amazed he is alive, and tells them his story. They have never heard of anyone named Sava Savanovic, but they decide an old woman in the village, Mirjana, might know of him because she is older than ninety. (A footnote here reminds us that this novella is based on folklore and that Mirjana was a real person said to have lived to be 110-120 years old. I should note here also that the translator went to Serbia to visit all the places associated with this vampire legend and found that how Glisic relates the story has some variation in the folklore, so it’s not known what he changed or embellished or if he wrote down an accurate version of what he heard.) Mirjana says she remembers Sava from her youth and that he was an evil man. She then tells the villagers where he was buried.

Of course, the villagers are now determined to find Sava’s grave and destroy him. To do so, they need three items: a black and ungelded horse who will be able to locate the grave, holy water, and hawthorn stakes. (The footnotes clarify that hawthorn was symbolic because it is what Christ’s crown of thorns was said to be made from. More relevant to vampires, it lets out trimethylene which is attractive to butterflies so they will often cluster on hawthorn branches. Butterflies are important here because corpses also release trimethylene, which causes butterflies to be attracted to decaying bodies. As a result, butterflies are often seen in cemeteries. The other important thing here is that butterflies were associated with the soul, and it was believed a butterfly (the soul) would fly out of the mouth when a person dies.)

The villagers, with the help of the horse, find the grave. The horse seems to sense where the vampire lies and starts digging in the appropriate place. Once the grave is dug up, the villagers open the coffin and find Sava lying there, his corpse undecayed and looking bloated from drinking blood. They plan to pour holy water down his throat, but they spill it, which awakens him. They have warned each other not to let a butterfly escape from his throat—apparently they would have drowned it with the holy water, but the butterfly does escape. Regardless, they stab the body with the hawthorn stakes to kill the vampire, and they tell themselves it’s no matter that the butterfly escaped because it can’t hurt “grown people.”

The villagers then decide that because of Strahinja’s bravery, he deserves to marry Radojka. They make a plan to kidnap her, which Strahinja argues against but finely gives into, and so Radojka is abducted. Her father comes after them and tries to shoot the abductors, but in the end, he comes to his senses and Radojka and Strahinja are married.

As for the butterfly, it’s said that it killed several children before finally disappearing from the region. (Apparently only “grown people” matter to the villagers.)

I admit I was a bit disappointed by the simplicity of the story—though, it is well told and has a marriage plot and happy ending with its Gothic tale at the center. It is more like a fairy tale, however, than a Gothic story—in the tradition of the young man who must do a fabulous deed to be worthy of the king’s daughter, kind of story, although the royal trappings are gone.

That said, it is worth reading. The translator’s note and introduction make several good points about the significance of the story. They explain how vampires were part of the pagan Slavic people’s mythology, but most of it was erased by Christianity so we can’t really understand the vampires’ place in that mythology today. There was a long history, however, of vampire stories in this culture. The concept of the vampire dates to ancient times, but the word vampire itself first appeared in Serbian in 1725 and then was translated into English and other languages in 1732. Because the vampire is based in folklore, it comes from a long oral tradition and is not the invention of fiction writers. While After Ninety Years could not have influenced Bram Stoker, the vampire folklore tradition from this period may have. Boylan notes that The Pobratim: A Slav Novel contained numerous Slavic folktales in it, including mention of vampires, and published in 1895 by Professor P. Jones. I wonder whether Stoker read The Pobratim and it influenced his creation of Dracula.

Glisic’s novel, although not a direct influence on the vampire of Western literature and film today, regardless is an interesting part of the history of the vampire’s development. While not a major work, it is an entertaining and very readable story with plenty of humor and an overall theme of good, or at least love, overcoming prejudice and evil.

______________________________

The post Write up on After Ninety Years: A Newly Translated 1880 Serbian Vampire Novella appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/21/write-up-on-after-ninety-years-a-newly-translated-1880-serbian-vampire-novella/feed/ 0 7475
Write up on Samuel DelanyÕs novel, Tales of Neveryon https://ddcomics.org/2026/09/21/write-up-on-samuel-delanyos-novel-tales-of-neveryon/ https://ddcomics.org/2026/09/21/write-up-on-samuel-delanyos-novel-tales-of-neveryon/#respond Mon, 21 Sep 2026 17:23:15 +0000 https://ddcomics.org/?p=7472 Background of the Study  Novelist and critic who taught literature and creative writing at the University of Massachusetts and Temple University, Samuel R. Delany had won four Nebula Awards and a Hugo Award by the time he was 27. He was inducted into the Science Fiction Hall of Fame in 2002, by which time he’d also been chosen by […]

The post Write up on Samuel DelanyÕs novel, Tales of Neveryon appeared first on DayDreamin’ Comics.

]]>

Background of the Study

 Novelist and critic who taught literature and creative writing at the University of Massachusetts and Temple University, Samuel R. Delany had won four Nebula Awards and a Hugo Award by the time he was 27. He was inducted into the Science Fiction Hall of Fame in 2002, by which time he’d also been chosen by the Lambda Literary Report as one of the 50 people who had done the most to change our view of gayness in the last half-century. In 2013, he was named the 31st Damon Knight Memorial Foundation Grand Master by the Science Fiction and Fantasy Writers of America.

​

Samuel R. Delany’s science fiction and fantasy tales are available in Aye and Gomorrah and Other Stories. His collection Atlantis: Three Tales and Phallos are experimental fiction. His novels include science fiction such as the Nebula-Award winning Babel-17 and The Einstein Intersection, as well as Nova and Dhalgren. His four-volume series Return to Nevèrÿon is sword-and-sorcery. Most recently, he has written the SF novel Through the Valley of the Nest of Spiders. His 2007 novel Dark Reflections won the Stonewall Book Award. Other novels include Equinox, Hogg, and The Mad Man. Delany was the subject of a 2007 documentary, The Polymath, by Fred Barney Taylor, and he has written a popular creative writing textbook, About Writing. He is the author of the widely taught Times Square Red / Times Square Blue, and his book-length autobiographical essay, The Motion of Light in Water, won a Hugo Award in 1989. All are available as both e-books and paperback editions.

         Delany is the author of several collections of critical essays.

         His interview in the Paris Review’s “Art of Fiction” series appeared in spring 2012. In 2015 he was the recipient of the Nicolas Guillén Award for philosophical fiction. His novella The Atheist in the Attic appeared in February 2018. Professor Delany retired from teaching at the end of 2015. He lives in Philadelphia with his partner, Dennis Rickett.

Literature Reviews

Samuel DelanyÕs novel, Tales of Neveryon , is a wonderful collection of fantasy stories set in civilization that is somewhat mysterious, but full of magic and surprise. DelanyÕs work explores such ideas as the power of language, sexual and social behavior, and the influence of money. Tales of Neveryon combines adventure and intrigue with intellectual stimulus to provide a great work of writing.

The book includes “The Tale of Gorgik,” which is the story of a boy who is taken into slavery. Gorgik is freed by a rich noblewoman who fancies him and is given a second chance [subject unclear]. Gorgik must adapt to a life of freedom and soon changes his naive view of the world. In the end[,] he becomes like the very slave traders who captured him and makes his fortune in shady and illegal dealings. “The Tale of Old Venn” is about a wise old womanÕs influence on a little girl. Venn teaches Norema that the world is not always as it seems and how such things as language and money influence culture. “The Tale of Small Sarg” is about a prince who is taken as a slave and eventually bought by Gorgik. In this tale, it is shown how sex can replace love for some people. “The Tale of Potters and Dragons” is about two young peoples  first adventure out of their home town, and their quest for wealth.

The first story, “The Tale of Gorgik” explores the issue of slavery literally and metaphorically. Gorgik is [a] slave in the literal sense until he is freed by the Vizerine Myrgot. Slavery changes Gorgik. It teaches him to survive at any cost, but it also takes away his compassion for other people. When he is freed he can not [one word] truly love anybody because he only understands owner and property as the relationship between people [he only understands the relationship between people as one of owner and property]. He is a slave to his beliefs. The Vizerine is also a slave. Even though she is a rich Page 2 noblewoman she cannot do whatever she wants. She is confined by the expectations of her social class. She must look and behave as they [unclear antecedent] want her to. Also she must bow down to those of higher rank. Myrgot also [too early repetition of this word] cannot love a person. If she marries someone[,] her title and lands would go to the male because of the customs of her culture. This is why she only has sexual relations with slaves such as Gorgik. [Good] Many people are confined like Gorgik and Myrgot by the customs of their culture.

“The Tale of Gorgik” — This first tale is a much easier entry into the volume, as it hews most closely to sword-and-sorcery tropes. A young boy is born into poverty, ends up enslaved, rises out of slavery through the strength of his character and a hefty dose of luck, and ends up with a respected position heading a garrison of soldiers after a brief stint at court. Of course, in this culture the civilized are dark-skinned and the barbarians (who usually become enslaved) are light-skinned; Gorgik’s main duties at court are as catamite to a noblewoman AND her eunuch steward; most of the nobles have been slaves at some point due to dramatic shifts in political fortune (though not all have developed an aversion to slavery as a result); and so on, as Delany plays with the ideas of power and race and class and gender and sexuality. Still, this tale can be read pretty much straight, as the tale of Gorgik’s development into the person that stands at the center of these tales. It also serves to introduce us to Nevèrÿon, the titular city on the brink of civilization, which has been playing with the idea of coined money for three generations and has had writing for a bit longer even than that. It is interesting to note that very early on the Child Empress (whose ascension to power resulted in Gorgik’s enslavement) changes the city’s name to Kolhari, and Kolhari it remains through the end of the volume (and likely further).

“The Tale of Gorgik” is the first and pivotal story, since Gorgik goes on to play important roles in most of the subsequent stories (and, I am given to understand, later books in the series). Gorgik is a light-skinned man in a land ruled by darker-skinned people. He becomes a slave and works in the mines until a high-ranking government bureaucrat pulls him up out of that position to use as her sex buddy. He lives on her sufferance at the imperial residence for a while, then she gives him an army commission and sends him packing. Eventually, Gorgik strikes off on his own, becoming a kind of adventurer. Yet his experiences have left him with a taste for freedom and a distaste for slavery, and we’ll see that later. All in all, “The Tale of Gorgik” is mostly a reflection on how one’s fortunes are often out of one’s control and depend upon the will and power of other players.

“The Tale of Old Venn” shows the power of language and the influence money can have on a culture. In the story, Venn tells Norema about the Ruvlyn culture and how language affects their society. In the Ruvlyn language, unlike most other languages, the same word is used for both the male and female genitalia. This causes the gap between genders to be smaller than those in other cultures. The men and women are more equal. They are more at ease with their sexuality. On some special occasions[,] they even switch roles as the men dress up as women and the women dress as men. Venn also talks about the influence that money has on the Ruvlyn. As the Ruvlyn change from a bartering system to a currency system, their social structure changes. The men become the handlers of money. The women compete with each other to marry a man with money instead of living in harmony with a man that can hunt. This change causes the Ruvlyn to lose very important cultural values and customs that used to form the binds of the tribe. [Why is this significant?]

“The Tale of Old Venn” — This second tale is the one where Delany makes his theme of narrative explicit; though it serves as a tale of Norema’s childhood the same way “The Tale of Gorgik” is the tale of Gorgik’s childhood, it is mainly there for the conversations between Norema and the wise woman Old Venn. This was my favorite tale, as I was fascinated by the way Old Venn explained the central concept and the various examples she used. Those examples also give us a picture of some of the “barbarian” cultures, the ones that are still skeptical of the idea of writing though they seem to have embraced coined money quite well, despite the way it has completely upended the way their societies function.

“The Tale of Old Venn” takes us across the land to an archipelago off the coast of Nevèrÿon proper. The peoples of these islands trade with Nevèrÿon but otherwise exist outside its influence. That is changing, however, because money is making its way through the land. Although comprising several stories told by the eponymous Venn, the protagonist of the frame story is actually Norema, who will later emigrate to Nevèrÿon and one day meet Gorgik. Through Venn’s stories, Norema is exposed to the potential problems with the introduction of money, as well as different ideas about gender roles. This story might be one of the most confusing to follow, simply owing to its structure.

“The Tale of Small Sar”g shows how some people try to use sex to fill the hole where love is missing and talks about homosexuality [subject unclear]. Gorgik purchases Sarg as a slave so he can have sexual relations with him. Gorgik was a former slave himself and was purchased by Myrgot so she could have sexual relations with him. Gorgik does not Page 3 understand love because no one has shown him love. He still wears the slave collar when he engages in sexual activity even though he is a free man. This symbolizes how he is not free to love. He can only possess, and this is what he does with Sarg. The relationship between Sarg and Gorgik also brings up the issue of homosexuality. Gorgik does not necessarily seem to be a homosexual. He has relations with women as well. Gorgik simply does not care who the person is. He only wants the body so he can fulfill his needs. This story is very relevant to todayÕs society where sex is seen everywhere and homosexuality is a major controversy. DelanyÕs comments on these subjects provoke interesting thoughts. [rather vague; elaborate]

“The Tale of Small Sarg” concerns a young man, little more than a boy, who is kidnapped from his people and sold into slavery (are you sensing a theme yet?). Sarg was revered as a prince among his people, which seems to mean he wasn’t responsible for doing all that much, because in his society women had most of the responsibility. As a slave, Sarg gets sold to Gorgik. The relationship between these two forms the core of this story, as they navigate complicated matters of sexuality, kink, and the power dynamics of master/slave—which might not be what you would expect, not that I want to spoil it. Basically, if you are familiar with Delany you shouldn’t be surprised that so many of his characters are super queer, and this is book no exception. This story advances Gorgik’s character development, setting him on the path on which we encounter him in subsequent books.

   
“The Tale of Small Sarg” — This third tale was a bit of a letdown for me. Small Sarg comes from an even more barbaric culture than Norema, one without writing or coined money at all. He is a prince in his land, but a slave in Nevèrÿon. A middle-aged Gorgik purchases him and beds him; he has a conversation with a young girl, and the story ends. It felt like a necessary placeholder, and while it too addresses the issues of slavery, gender roles, and sexuality, it just didn’t quite satisfy after “The Tale of Old Venn.”

In “The Tale of Potters and Dragons,” the woman warrior, Raven, tells the creation myth of her culture. In the myth, God, who is feminine, creates two women. The second woman offends God and is turned into a man as punishment. This story is very contrary to most peoplesÕ beliefs. In the Christian religion, God is masculine. Also, man was created first. It is evident from the story that Raven tells that her culture is a matriarchy. Also the fact that she carries a sword shows the gender roles of her society. [How so? Needs further explanation.] In this tale, Delany shows how different cultures have different myths and stories and how these myths affect their culture.

“The Tale of Potters and Dragons” — This fourth tale returns to Norema, now a secretary in Neveryon. She embarks on a business trip for her employer and encounters Raven, a traveler from an Amazonian culture who is by turns amused and apalled at the odd gender roles she has encountered in Nevèrÿon. Norema has a run-in with politics and sees some of the concepts she discussed with Old Venn in action. There’s a hefty dose of irony about this tale, and I would not have minded if it had been twice as long.

 ” The  Tale of Dragons and Dreamers” — This fifth and final tale is where Gorgik and Norema’s paths finally cross. Gorgik and Small Sarg have been getting into trouble; Raven and Norema have been mostly staying out of trouble, and the men stumble onto the women’s campsite and share a meal. Much is revealed to the reader, rather less is revealed to the characters, and again, the tone is ironic. There is actually some action in this tale, and again, Delany packs a whallop thematically into not very many pages.
 
“The Tale of Dragons and Dreamers” brings together Norema and Raven with Gorgik and Sarg. The best way I can describe this is that Sarg basically yells, “RAMPAGE!” and runs into a castle and kills as many guards as possible, kind of like Sir Lancelot in Monty Python and the Holy Grail. The scenes are literally kind of cinematic in that way. But anyway, this is the story that sees the culmination of the narratives on slavery, power, and economic revolutions. It’s a short but powerful tale amplified by the reader’s awareness of the previous narratives.

DelanyÕs novel is overall a good book, but information about the setting and backgrounds of the different peoples of Neveryon is somewhat lacking. There are many places in the story where it is unclear as to where the different cities are located and to what country they belong. Norema is apparently from an island far away from Neveryon, but Delany does not say exactly where. Raven is from a matriarchy, but Delany does not Page 4 say where exactly she is from or tell much about this matriarchy. The fact that the book is told in several interlocking stories also adds to the confusion about where and when the events take place. Delany could have provided more background information for his settings or at least provided a map of the different places.

Tales of Neveryon deals with a wide range of social and ethical issues. The novel is extremely well written and is worth reading. The stories it contains are so fascinating because they contain the adventure and magic seen in most fantasy works plus deeper ideas for the reader to ponder. I would recommend it to all fans of fantasy.

[Final comments: Graham, this is a strong review for the most part (good, concise renditions of plot and the beginnings of a strong analysis); however, I do feel that you could have gone further in your analyses of the individual tales. Although quite good, these analyses feel somewhat abrupt. Still, I enjoyed reading this review and I’m sure the class will too.]

Lastly, we have “Appendix: Some Informal Remarks Toward the Modular Calculus, Part Three”. This is where I’ll state the controversial opinion that you could, indeed, just skip this entire part if you wanted. I think it’s possible to enjoy Tales of Nevèrÿon on the strength of the stories alone without worrying too much about what Delany is doing here. However, if you’re into considering the deeper implications of Delany’s work, then it is worthwhile reading and trying to parse this last entry. This is “part three” of these informal remarks; the first two are in Triton: An Ambiguous Heterotopia (the main story is “part one” and an appendix to that story is “part two”).

So Delany is trying to link his works, trying to create a common thread throughout them. I don’t have the energy or memory to really compare Triton with these stories. But I can see some similarities between Dhalgren and these stories. In both cases, Delany makes much of the deconstruction and semiotic analysis as pioneered by Derrida. Language and symbols have huge significance in Tales of Nevèrÿon: in “The Tale of Gorgik”, Curly lectures Gorgik over the depth and significance of the few words the Child Empress utters to him; in “The Tale of Old Venn”, the rult that Venn describes from her time among the Rulvyn is a potent symbol, and this story also examines the utility of writing; in “The Tale of Small Sarg”, the slave collar that Sarg wears plays an important role in the relationship between Sarg and Gorgik beyond denotation of who is the slave … and so on.

The post Write up on Samuel DelanyÕs novel, Tales of Neveryon appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/21/write-up-on-samuel-delanyos-novel-tales-of-neveryon/feed/ 0 7472
Write up on Phyllis Eisenstein’s Sorcerer’s Son https://ddcomics.org/2026/09/21/write-up-on-phyllis-eisensteins-sorcerers-son/ https://ddcomics.org/2026/09/21/write-up-on-phyllis-eisensteins-sorcerers-son/#respond Mon, 21 Sep 2026 17:19:54 +0000 https://ddcomics.org/?p=7468 Background of Study Nebula and Hugo nominated author Phyllis Eisenstein died December 7 at the age of 74 after a year-long struggle with serious neurological problems. The family obituary, which will appear in the Chicago Tribune, is here. Eisenstein was born in Chicago in 1946, grew up there, and for awhile attended the University of Chicago. […]

The post Write up on Phyllis Eisenstein’s Sorcerer’s Son appeared first on DayDreamin’ Comics.

]]>

Background of Study

Nebula and Hugo nominated author Phyllis Eisenstein died December 7 at the age of 74 after a year-long struggle with serious neurological problems. The family obituary, which will appear in the Chicago Tribune, is here.

Eisenstein was born in Chicago in 1946, grew up there, and for awhile attended the University of Chicago. She met her future husband Alex at the weekly gathering of Chicago science fiction fandom. They married in 1966.

Her first published sf story was “The Trouble with the Past”, written in collaboration with Alex, in New Dimensions 1 (1971) edited by Robert Silverberg. An acclaimed writer with six published novels and 50 short stories, she was twice nominated for the Hugo Award, for her novella “In the Western Tradition” (1982, also a Nebula nominee), and the novelette “Nightlife.” Two additional works were Nebula nominees, the short story “Attachment” (1976) and novelette “The Island in the Lake” (2000). Her short story “Subworld” was a Seiun Award nominee (1997). Eisenstein’s novels Born to Exile won a Balrog Award (1980) and Sorcerer’s Son was a British Fantasy Awards finalist (1980).

Her 1978 short story “Lost and Found” was adapted for television by George R.R. Martin and aired in 1986 on The New Twilight Zone.

She also wrote a nonfiction book, Overcoming the Pain of Inflammatory Arthritis, which she said “is about the use of pantothenic acid (vitamin B5) for arthritis, a disease I’ve had all of my adult life.”

After establishing herself as a professional writer, she returned to college and finished her education, earning a 1981 B.A. in anthropology from the University of Illinois.

For fifteen years she was the Managing Copy-editor at Leo Burnett Agency, and worked at the Publicis Agency for several years prior to joining Burnett.

Eisenstein was also a gifted teacher, beginning by assisting Roger Zelazny at the Indiana University Writers Conference in 1977, then teaching sff writing at the Clarion Science Fiction Writers Workshop, Oakton Community College, and the Writers Digest School. Ultimately she taught fiction writing for nearly twenty years at Columbia College Chicago where she received the Excellence in Teaching award.

One recommendation she made to improve a writer’s work even showed up as a Jeopardy! game show answer in 2016 —

  • In A Storm of Swords, he acknowledged “Phyllis, who made me put the dragons in it.”

The correct question was “Who is George R.R. Martin?”

Martin dedicated the third book in his A Song of Ice and Fire series to her for reasons he explained on a panel at Chicon 7 in 2012:

“The dragons were one aspect that I did consider not including. Very early in the process, I was debating, should I do this just as like historical fiction about fake history, and have no actually overt magic or magical elements, but — my friend Phyllis Eisenstein, a wonderful fantasy writer who lives here in Chicago, I happened to be talking to her at very early stage in the process. Phyllis has written some great fantasies herself. She said, “Nah, you have to have dragons. It’s a fantasy, you know!” And I dedicated A Storm of Swords to Phyllis, who made me put the dragons in, and I think that was the right thing to do.”

She was an icon of Chicago sf fandom. At the Chicon 2000 Worldcon, the Fan Lounge was laid out as the reconstructed living room of a Chicago fan of the ‘80s. The space was furnished with an ill-assorted bunch of old couches, lamps and end tables. One couch was occupied by two crash-test dummies, the first dressed as Neil Rest in sandals, jeans and a Windycon 7 t-shirt, and the other as Phyllis Eisenstein, attired completely in black, a “goth” ahead of her time.

Literature Review

After the sorceress Delivev Ormoru rejects his marriage proposal, sorcerer Smada Rezhyk becomes worried that she’s out to get him. In order to reduce her powers so that he’ll have time to weave himself a protective gold shirt, Rezhyk sends his demon slave Gildrum to impregnate Delivev with Rezhyk’s own seed. Gildrum takes on the form of a handsome young knight (Mellor) and shows up injured at Delivev’s doorstep. As expected, Delivev falls in love with Mellor, but unexpectedly, Gildrum (who doesn’t even have a heart) falls in love with her, too. However, Gildrum must return to serve Rezhyk. He doesn’t tell Delivev that he’s really a demon — he lies and tells her that he’ll come back after he delivers a message.

Sure enough, Delivev becomes pregnant and gives birth to Cray. And, of course, Mellor never returns. When Cray becomes a teenager, he decides to find out what happened to the father whom his mother still loves. This leads to a series of adventures which create more questions than answers.

The plot of Sorcerer’s Son is original and interesting — especially the parts in which Delivev or Rezhyk appear. Delivev has control over nature — particularly snakes, spiders, and ivy. Rezhyk summons and enslaves various types of demons who live in a complex world and follow strict rules about summoning. These parts are very creative and entertaining and I found that I have developed a respect for Phyllis Eisenstein’s imagination.

The Book of Elementals — (1979-1988) The Book of Elementals contains both Sorcerer’s Son (1979) and The Crystal Palace (1988) reprinted and packaged together. The third novel in the series, The City in Stone, has not been published. You can read Chapter 1 on Phyllis Eisenstein’s website. Publisher: As Cray Ormoru, son of the enchantress Delivev, grows to be a man in magical Castle Spinweb, he yearns to find his father, who disappeared years before on a heroic mission. And so Cray sets out on the journey which would take him from town to castle to a fortress of bronze, totally unprepared for the sorrows and dangers that lie ahead. For the fate of Cray’s father would only be discovered by the light of demon fire.

Significance of Study

Sorcerer’s Son is a classic quest-based high fantasy, set in a pseudo-medieval European world of knights, castles, sorcerers and demons. The hero, a young man named Cray who has been raised in protective isolation by his sorceress mother, ventures into the world to find the identity of his father who vanished before his birth. So far, so standard. But unlike much of modern YA, where the sole focus is on the young protagonist and their coming-of-age journey, Sorcerer’s Son tells another side of the story. So, let’s rewind. This story starts before Cray’s birth: it’s the story of two fathers. The straight father and the queer father; the annihilating, rage-filled biological father and the father of love, and choice.

Rezhyk is a self-centred, tyrannical sorcerer who enslaves demons to do his bidding. His first and most powerful slave is Gildrum: a bodiless fire demon he has forced into the physical form of a pubescent girl. When a sorceress rejects Rezhyk’s offer of marriage, he flies into a furious, paranoid delusion that she must plan him harm. He gives Gildrum a new mission and suitable body with which to carry it out: curtail the sorceress’ powers by impregnating her. Gildrum’s cynical mission goes awry when, after seducing the sorceress with his beautiful male body, he falls in love in return. But the demon is still a slave. Forced back to Rezhyk once the mission is complete, imprisoned once again in a girl’s body, Gildrum can only watch helplessly from afar as her son—Rezhyk’s biological son, but the son of Gildrum’s heart—becomes a man. As Cray pursues his quest, his path leads to Rezhyk’s castle. There, he unknowingly meets his two fathers: the cruel and violent man who desires both his and his mother’s death, and the girl-shaped demon who seeks to save them.

Having vanquished Sorcerer Rezhyk, nothing remains for sorcerer Detivev Ormoru and her son Cray but to live happily ever after. Easy enough for Detivev, who has her doting demon lover Gildrum. Easy enough for all the demons liberated by the relentless Cray. But where is Cray’s happily ever after?

The answer begins with a magic mirror.

The Seer Sepwin has constructed a mirror in which the viewer’s heart’s desire can be seen. It shows images without any explanation. Cray looks in the mirror and sees a girl who is presumably his heart’s desire. However, he has no idea who she is or where to find her. He dithers. The next time he looks in the mirror, the girl has grown. At last, he sets out to find her.

After great difficulties, Cray learns that Aliza is a human woman who lives in a crystal palace in a supernatural realm of ice. He appears unannounced at her home, hoping to befriend the woman in the mirror.

Aliza remains oddly cool to Cray. Perhaps this is because she seems to have no soul. Aliza’s grandfather Everand, the sorcerer who imprisoned Aliza in the crystal palace, might be able to explain the matter? Asking would be futile, as Everand has good reason to conceal what he is up to. As well, although neither man knows it, Cray is Everand’s bitterest enemy.

~oOo~

This series started out at publisher Del Rey with Sorceror’s Son1. The next volume in the series, this one, was published by Signet. At first glance I thought Signet had commissioned another cover by Darrel Sweet for consistency of appearance. In fact, the artist was Richard Hescox, whose art I had not thought similar to Sweet’s.

Why the friction between two men who have never met? Everand is a sorcerer and like all sorcerers, gets his power by enslaving demons. He covets more demons to enslave. Cray has spent years freeing demons and placing them beyond sorcerous control. He is thus a bitter enemy to (almost) all sorcerers2. Good thing for Cray that the freed demons have refused to reveal who freed them. Although Everand has no idea who the liberator is, he knows that there is one and been searching for the person’s name without success… at least by the time the novel begins.

Whereas Rezhyk, the antagonist in the previous volume, was dangerous because he was powerful3, Everand is dangerous because he is weak. Having been victimized by other sorcerers in the past, he is determined to become as powerful as his abusers. Lacking sorcerous aptitude, Everand does his very best to compensate with a degree of ruthlessness that is unusual even for sorcerers.

It is fortunate indeed for Cray that the author is his ally. If she weren’t, perhaps readers might think Cray a stalker. He tracks Aliza down and shows up expecting to be received as a friend. He sees himself as a hero rescuing a maiden from bondage. But the reality is that Aliza is content with her life. She has a demon friend and spends her time studying magic.

But the author reveals that Aliza is after all in great danger and that Cray is ideally suited to save her. He’s a hero, not a stalker, and all is well.

The moral: before embarking on a one-sided romance, establish that you are the protagonist and not just a creep.

1: If I am reading the ISFDB correctly, Eisenstein’s first few novels published in the USA were put out by Dell. There was one exception, Sorcerer’s Son, from Del Rey. Then she moved the series to Signet, and finally to Meisha Merlin, who burned her career down to the water-line.

2: Cray is, of course, not his mother’s enemy. She doesn’t need demonic slaves to have power. Cray is a sorcerer, but he doesn’t need to enslave demons; he just asks grateful freed demons for favors.

Demons do not like being enslaved. With the legions of freed demons growing every day, one has to wonder if the demons are taking revenge for their enslavement. If that’s so, any list of sorcerers would be shortening rapidly.

3: Everand is paranoid. In this secondary universe, many sorcerers seem to be paranoid, and for good reason. Sorcery depends on enslaving demons. Sorcerers do not limit themselves to victimizing demons; anyone weaker is seen as fair game.

“Sorcerer’s Son” and “The Crystal Palace” are novels set in a magical universe where individuals harness supernatural powers through study and the control of demons from various elemental realms. The story begins with the sorcerer Smada Rezhyk, who, feeling threatened by other sorcerers, seeks to secure his position through a marriage proposal to Lady Delivev. After she refuses, he manipulates the situation using one of his demons, Gildrum, to seduce her, leading to the birth of their son, Cray.

As Cray grows up, he becomes determined to uncover the truth about his father, embarking on a quest filled with friendship, betrayal, and the discovery of his own magical potential. In the sequel, “The Crystal Palace,” Cray, now restless and searching for purpose, becomes infatuated with a girl named Aliza, who is isolated by her grandfather’s sorcery. As Cray learns more about Aliza’s tragic circumstances, involving her missing soul and her grandfather’s sinister motives, he vows to rescue her from her fate.

The narratives explore themes of identity, the struggle against manipulation, and the quest for freedom, as Cray ultimately confronts powerful sorcery to save those he loves and reshape his destiny. Through their journeys, the characters navigate challenges that test their bonds and their understanding of power and autonomy.

To distract Delivev while he weaves metal clothing that will not be under her influence, Rezhyk sends Gildrum, one of his demons, to her in the guise of a handsome, wounded knight. Gildrum bears enough of Rezhyk’s semen to impregnate her. The seduction is successful, but Gildrum is genuinely attracted to Delivev and leaves her only because he must do as Rezhyk commands.

Delivev’s son is called Cray. His childhood is happy, but as he grows up he determines to become a knight like his supposed father and to find out why his father has never returned. Unknowingly, he receives supernatural encouragement in his quest, whenever Gildrum can steal moments from Rezhyk’s service. Cray becomes friends with Feldar Sepwin, a young man who is an outcast because of mismatched eyes.

Even after Gildrum fakes evidence that the knight is dead, Cray and Feldar continue on their quest to what was supposedly his home castle but discover that no such knight had served there. The two friends go to the Seer Helaine’s cave to learn the origin of the shield Gildrum left at the knight’s supposed grave. Cray again fails to find news of his father at the castle from which the shield came, but the kindly lord there gives him training so that he might become a knight himself. Cray, however, must leave to follow his obsession. Following the Seer’s advice, Cray and Feldar explore the supposed grave, but they find no body. Realizing that magic is involved, Cray decides that the only way he can find his father is to become a sorcerer himself.

Because Cray’s mother is unable to give him the training he needs, he offers himself as apprentice to Rezhyk, who by now has become completely paranoid but who fears to reveal his guilt by rejecting Cray immediately. Instead, Rezhyk bullies Cray mercilessly, attempting to make the young man quit voluntarily. Gildrum befriends Cray, but Cray figures out the identity of his biological father and leaves Rezhyk’s castle in dismay. Rezhyk instructs Gildrum to kill the boy, but the demon evades the command. Cray realizes that it must have been Gildrum who carried the sorcerer’s seed to Delivev. They become allies to destroy Rezhyk. Gildrum transports Cray to the various demon realms, in each of which Cray meets many who are intrigued with the idea of a human who would rather try to befriend them than enslave them. Cray vows to break the sorcerous rings that enslave demons, freeing them irrevocably, as soon as he can.

Meanwhile, not knowing what has happened to her son, Delivev sends an innocent inquiry to Rezhyk, who takes it as a declaration of war and attempts to incinerate her and her home. While she defends herself, Cray and his demon army attack Rezhyk’s castle. The boy kills his genetic father to save his mother and his emotional father. Gildrum settles into human form to live with Delivev, and Cray decides to continue his sorcerous studies.

At the beginning of The Crystal Palace, the basic situation has changed little. Cray is increasingly restless but uncertain of what he wants. Feldar, Cray’s friend, is apprenticed to the Seer Helaine. He discovers a magical mirror that reveals one’s heart’s desire, but it gives Cray only pictures of an unfamiliar little girl in an unknown place. Over the years, however, as the girl grows into a beautiful young woman, Cray becomes obsessed with her. With Gildrum’s aid, he locates her home, in a crystalline structure at the intersection of the human world and the realm of Ice.

Going there with demon companions, Cray attracts the attention of the girl and is admitted into the crystal palace. Her name is Aliza, and she tells Cray that her grandfather, the sorcerer Everand, has left her in isolation except for one ice demon slave so that she can study to acquire sorcerous mastery over Ice. She is perfectly content with the arrangement, but Cray perceives that she has had extremely limited contact with anything outside her dwelling and vows to widen her experience. She becomes interested, even curious, but remains distant from him even as he becomes more emotionally involved with her.

On the way to Delivev and Gildrum’s castle, Aliza visits the Seer’s cave to find out what her heart’s desire might be. The mirror crumbles, and the Seer discovers that Aliza cannot have normal desires because she literally lacks a soul. It has been removed and hidden by her grandfather so that he will always have control over her.

Despite Aliza’s protests that she is comfortable as she is, Cray and his allies begin investigating Everand. They discover that he actually is a puny sorcerer who was embittered as a young man when his parents rejected him after his sorcerous master died without giving him any real power. Everand killed his own daughter and her lover to gain possession of their child, Aliza, in a scheme to gain power for himself through her single-minded studies. When Everend confronts Cray and Aliza, he admits his purpose, but he uses Aliza’s soul to cause her so much pain that Cray withdraws rather than see the woman he loves hurt.

With his demon friends and the covert aid of Everand’s single ice demon slave, Cray attacks Everand’s stronghold and kills him. In Aliza’s crystal home, they discover the hiding place of Aliza’s soul. It is guarded by sorcerous barriers, so Cray must take it into himself, nullify the magic, and breathe it into her through a kiss. With her soul restored, Aliza clings to Cray, and the two begin a life together.

The post Write up on Phyllis Eisenstein’s Sorcerer’s Son appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/21/write-up-on-phyllis-eisensteins-sorcerers-son/feed/ 0 7468
Write up on Garth Nix’s Sabriel https://ddcomics.org/2026/09/21/write-up-on-sabriel-garth-for-nix/ https://ddcomics.org/2026/09/21/write-up-on-sabriel-garth-for-nix/#respond Mon, 21 Sep 2026 17:11:54 +0000 https://ddcomics.org/?p=7464 Garth Nix OAM has been a full-time writer since 2001, but has also worked as a literary agent, marketing consultant, book editor, book publicist, book sales representative, bookseller, and as a part-time soldier in the Australian Army Reserve. Garth’s books include the Old Kingdom fantasy series: Sabriel, Lirael, Abhorsen, Clariel, Goldenhand, and Terciel and Elinor; […]

The post Write up on Garth Nix’s Sabriel appeared first on DayDreamin’ Comics.

]]>

Garth Nix OAM has been a full-time writer since 2001, but has also worked as a literary agent, marketing consultant, book editor, book publicist, book sales representative, bookseller, and as a part-time soldier in the Australian Army Reserve.

Garth’s books include the Old Kingdom fantasy series: Sabriel, Lirael, Abhorsen, Clariel, Goldenhand, and Terciel and Elinor; SF novels Shade’s Children and A Confusion of Princes; fantasy novels Angel Mage; The Left-Handed Booksellers of London and sequel The Sinister Booksellers of Bath; and a Regency romantasy, Newt’s Emerald. His novels for children include The Ragwitch; the six books of The Seventh Tower sequence; Frogkisser! and The Keys to the Kingdom series; plus, co-written with Sean Williams, the Troubletwisters and Have Sword Will Travel series and Spirit Animals: Blood Ties. He is also the author of more than sixty published short stories, some of them collected in Across the Wall and To Hold The Bridge.

His most recent books are Sir Hereward and Mister Fitz: Stories of the Witch Knight and the Puppet Sorcerer, which collects all nine stories of the godslaying duo; and the children’s novel We Do Not Welcome Our Ten-Year-Old Overlord.

More than seven million copies of Garth’s books have been sold around the world, they have appeared on the bestseller lists of The New York Times, Publishers Weekly, The Bookseller and others; and his work has been translated into 42 languages. He has won multiple Aurealis Awards, the ABIA Award, Ditmar Award, the Mythopoeic Award, CBCA Honour Book, and has been shortlisted for the Lodestar Award, the Locus Awards, the Shirley Jackson Award and others. In 2025, he was awarded the Medal of the Order of Australia (OAM) for “services to literature”.


Literature Review

Three miles from the Wall into the Old Kingdom, a woman gives birth to a baby before dying. The band of Travellers who helped the woman thought the baby would die too but Abhorsen makes a dramatic entrance and equally dramatic declaration that there shall be a baptism tonight. The midwife holds the baby, and Abhorsen declares they shall see what Charter wills. Abhorsen takes a bottle from his pouch and annoints the baby, a great flash lights up the forest and he declares the baby’s name is Sabriel. The Charter has accepted the baptism and left a mark on her forehead, however, Abhorsen must go beyond the veil and to the First Gate, following the baby’s cries. He finds Kerrigor holding the baby. Sabriel does not like being held by Kerrigor and fights him and his shadow until Kerrigor throws the baby away. She is caught by the river and Abhorsen is able to collect her. Abhorsen then uses a silver bell to confuse Kerrigor who flinches and falls into the blackness beyond the gate. Abhorsen returns to the camp, Sabriel very much alive in his arms. At the camp, Abhorsen offers the midwife work to help him raise his baby and declares his intentions to join the band of Travellers. When the Charter Mage of the band asks what he does, Abhorsen explains he is not a normal necromancer; he lays the dead back to rest. 

Sabriel has been attending Wyverley College since Abhorson came over the Wall from the Old Kingdom and dropped her off at age five. The school was established in 1652 for “Young Ladies of Quality” and Sabriel is one of the top students… just not in etiquette. Sabriel has already graduated but needs to make a decision, go back to the Old Kingdom and her father, or go to university further away from the Wall where she will likely lose the link to her magic and affinity with the dead, but is that a bad thing? That night, while waiting for her father to call by his typical magical means, one of the other students interrupts Sabriel’s vigil, alerting her that she may have accidentally perhaps opened the door to the outside and let in a monster. Oops. Sabriel dashes to the dormitory to find a shadowed figure shuffling amongst sleeping students, a Dead servant, who has no free will and was sent back to the living world and controlled from beyond the First Gate. Sabriel enters the place between life and death to see its true form and it’s carrying a sack. Sabriel claps her hands and whistles, shocking the creature, and it drops the sack and falls into the river. Sabriel takes the sack and returns back to the living. Inside is her father’s sword and bandolier of bells. Decision made, Sabriel must return to the Old Kingdom. 

The area around the Wall is like a war zone, trees are stripped of leaves and branches, razor wire spans the perimeter, soldiers carrying bayonets are stationed, and warning signs are everywhere. Sabriel arrives on a tour bus and while the rest of the visitors go to the watchtower, Sabriel declares to a fresh-faced soldier that she is a citizen of the Old Kingdom and is there to cross the border. The soldier asks to see her passports which Sabriel magically reveals. Her magic brings out a whole platoon of soldiers with their bayonets pointing at her. Colonel Horyse quickly examines Sabriel’s documents and calls off his soldiers. He has known her father, Abhorsen, for twenty years. Abhorsen came to help keep the dead dead by installing wind flutes in the fence. Reluctantly Sabriel tells him she fears her father is dead or captured by Death, which means his flutes may stop working. 

Sabriel has read the Book of the Dead so she may be able to help maintain the wind flutes, but the time it would take would be better spent in the Old Kingdom travelling to her father’s house and figuring out what has happened to him. They have until the next full moon, fourteen days away, before they find out if the binding on the flutes has failed. Reluctantly, Horyse permits Sabriel’s crossing. There really is no reason to stop her other than concern for her safety, so with good tidings and hope that she is able to find Abhorsen, Horyse and his men see Sabriel across the Wall. It’s snowing in the Old Kingdom, so it’s a good thing Sabriel brought her skis. She is soon speeding her way over the snow and into the night to her first destination: Cloven Crest Charter Stone. 

It doesn’t take long for Sabriel to come across the dead body of one of Horyse’s patrol. They’ve been dead for twelve days and there is no obvious reason why. Sabriel burns the body using Charter signs and continues on, but then she feels the pull of more dead, more of Horyse’s men. Unlike the lone soldier, these men have been hacked to pieces and decapitated, and whoever did this has taken their heads. Sabriel brings the bodies together, laying them out with their swords plunged into the ground where their heads should be. As Sabriel continues on to the Charter Stone, she happens upon a message left by one of the dead, one who was Charter Mage. “One of the Greater Dead! It came behind us, almost from the Wall. We couldn’t turn back. It has servants, Hands, a Mordicant! This is Sergeant Gerren. Tell Colonel…”  Sabriel’s father was sworn to stop the Greater Dead… As the new moon is revealed by the clouds, Sabriel continues on her journey to Cloven Crest.

The Charter marks on the stone at Cloven Crest are dead, split when a necromancer sacrificed a Charter Mage to gain access to Death or help a Dead spirit break through into Life. Regardless, Sabriel needs to call a guide to take her to her father’s house and the sacrifice will actually make the connection to the dead stronger. Sabriel makes the Charter marks with her sword in the snow, and once complete and the way open, Sabriel steps though and into the river, launching a paper boat. After a long time, she hears the noise of the Second Gate growing still. Something is coming back from the deeper realms of death. Hopefully it’s what she invited. 

The pale light of her guide approaches Sabriel, the spirit of her mother. Sabriel asks for directions to her father’s house, Barhedrin Ridge, and the spirit gives her some very detailed instructions before telling Sabriel Do not tarry, do not stop, no matter what happens. Suddenly, the other creature who heard and felt Sabriel’s Charters, the creature Thralk appears. Thralk is dead but hidden from Death for three hundred years, and it wants Sabriel’s power to prolong its existence. Sabriel uses her father’s sword to pin it and one of the bells from her bandolier to return him to Death. As Thralk is thrown back, it curses Sabriel, promising to tell the servants of Kerrigor. Sabriel can’t think about that now, she has a long journey to Barhedrin Ridge and must heed her spirit mother’s words: Do not tarry, do not stop, no matter what happens as all the way, she is stalked by a Mordicant, a creature that can pass at will through Life and Death, its body made of bog-clay and human blood molded and infused with Free Magic by a necromancer, with a Dead spirit placed inside as its guiding force. Sabriel makes it to Barhedrin Ridge but can’t close the doors because the Mordicant’s taloned hand is reaching through. 

Charter magic flares around the door and a Charter-ghost appears carrying a twin sword to Sabriel’s. The spirit brings the sword down on the Mordicant’s talons, allowing the door to close, but it’s a temporary solution. The Charter-spirit points down the corridor and Sabriel follows, she doesn’t need to be told twice, leaving her pack and skis where they fell, needing only her sword and bandolier. As she walks quickly, Sabriel hears the Mordicant’s howls behind her and a heavy crashing noise ahead. At the next door, a hooded Charter-ghost appears and opens the door to reveal a large waterfall. Perfect! The Mordicant will not be able to cross the running water. With care, Sabriel follows the ledge, then the steps leading down, then the stepping stones to the island in the middle of the fast running river where Abhorsen’s home sits. Sabriel is bone weary, she can hear the Mordicant breaking through the door above her, but thankfully it can not follow, though it stands waiting. Finally Sabriel reaches the door to Abhorsen’s home and on the mat is a white cat. Its red collar has some of the most powerful Charter signs inscribed and a tiny bell dangling from it. This is no ordinary kitty, it’s a Free Magic creature of ancient power and greets Sabriel, telling her, “About time you got here.”

Sabriel wakes in a nice soft bed, the talking cat not far away. He introduces himself as Mogget, a servant of Abhorsen for a very, very long time and judging by the over thousand year old binding spells on the collar, that is an understatement. One of the house’s ghost servants comes in to bathe Sabriel before dinner. In the dining hall, she meets the many other house servants and Mogget explains each new Abhorsen likes to create one as the longer serving ones become sassy and above their station, which Sabriel encountered first hand during her bath. The ghost servants acknowledge Sabriel as their new master before serving her and Mogget dinner. Mogget refers to Abhorsen like a title not a name and insists her father must be dead since she holds his sword and bandolier. Sabriel disputes this and is sure her father is still alive and means to find out. Mogget tries to make Sabriel promise she will not raise her father back to life if his physical form is dead, she can’t promise but will take his advice into consideration. 

In the study, Sabriel has located the Book of the Dead as well as books on Charter symbols. She only knows up to chapter 4, so she has a lot of studying to do. Mogget comes in and warns her the Book of the Dead can change, so though she may think she has read it cover to cover, likelihood is she hasn’t. One of the ghost servants comes down a ladder through a trapdoor in the ceiling and gestures for Sabriel to follow them up. On the roof there is a glass dome and telescope, it’s an observatory! The ghost spirit points in the direction Sabriel came from, the Mordicant is still there, standing sentry, but it’s surrounded by living human servants and a man-shaped blot of blackest night, a necromancer’s shadowhand directing operations. The servants are building boxes, filling them with grave dirt and fixing them between the stepping stones on the river so that the dead may cross. That’s not good. Mogget points out there is a defense, a ritual to raise the water of the river which will wash away any intruders. It will take several weeks for the waters to go back down, but not to worry, one of Sabriel’s ancestors built a flying machine with paper that will allow her to leave. If they are to use this ritual, they must start now so it will be ready by the following evening. 

The wave was easy to summon and caused absolute devastation along the river. Mogget tells Sabriel to hurry up, she must be on her way to Belisaere, but also that she doesn’t have a map so he’ll just have to come with her. Sabriel agrees, but still wants a map which again Mogget can help with. Convenient. Soon, they are ready to go, since Mogget is coming too, he vomits a small silver ring, with a ruby gripped between two silver claws that grew out of the band, telling Sabriel she needs to take it too. When she puts it on (there is no mention that she cleans it first) Sabriel feels an overflow of Free Magic connected to Charter marks. She doesn’t understand but Mogget reassures Sabriel that she will when the time is right. Now, to the Paperwing.

The Paperwing looks like a canoe with hawk-wings and a tail, and is lined with many Charter marks. Sabriel needs to use Charter marks in mind and whistles to summon the right winds for the flight. The journey is smooth and freeing, until Sabriel decided to push on against Mogget’s recommendation to stop for the night and a particularly hairy moment with gore crows meant Sabriel went off course and lost the right winds for stable flight. The Paperwing goes into freefall, Mogget screams at Sabriel to loose his collar but remember the ring. Sabriel loosens the collar and something indescribable happens to Mogget, he becomes light or power and is able to stop the Paperwing’s free fall, landing the Paperwing on the lip of an enormous dark hole directly in their path.

Sabriel falls in and out of consciousness, eventually managing to stay awake long enough to look in her pack for a candle. Once she has light, she is able to see that the Paperwing did not survive the crash. She looks for Mogget, there is no sense of Death, just Free Magic, so he must be around somewhere. Suddenly she sees flashes of white and the Paperwing on fire and a humanoid figure appears. It has no legs and its torso and head are balanced on a whirl of force and it speaks with Mogget’s voice, dripping with malice, as he mocks and taunts her. Sabriel tries to think, but she is terrified and Mogget is relentless. Sabriel unsheathes her sword and she and Mogget fight, but really it’s a game of cat and mouse (pun intended). Eventually Sabriel remembers the ring. Looking at it, she realizes there are instructions for the bells on her bandolier. Finally with the bell still ringing, Mogget returns to his cat form, red collar in place. 

The next day Sabriel and Mogget don’t mention Mogget’s attempted murder of Sabriel. At one point Mogget goes to investigate the sinkhole they are stuck in while Sabriel nurses her wounds. Mogget returns having found a tunnel that is interesting, and resigned, Sabriel grabs her pack. After a while, Sabriel and Mogget emerge into another sinkhole, this one bigger than the first. Interestingly, in the middle of the sinkhole, amongst the vegetation, there are paved areas and royal funerary ships. Together they explore and on the third ship find a highly detailed carved figurehead of a (naked) man. Sabriel sends out her magical feelers and discovers the man’s spirit is in neither Life nor Death. While Mogget naps, Sabriel decides to go into Death to find the man. She finds him in Death looking exactly as the figurehead. He is not dead but in a spirit-form, his living body preserved as wood. Sabriel grips the spirit-form and pulls him from the river to Life. The man’s spirit is back where it belongs, but according to Mogget, he needs a kiss to bring him back… well, a breath will do. Sabriel leans over and breathes on the figurehead. After a few moments the man starts to breathe and color comes back to him. Sabriel realizes he’s still naked and goes to get a spare shirt and blanket. Mogget licks the man’s forehead where his Charter mark is. Mogget is surprised and a little angry, his little bell tinkles.

The man wakes up while Sabriel is getting washed, Mogget is there though and remembers him and he remembers Mogget being bigger. Neither of them can talk about their history though because of a magical compulsion. Mogget instructs the man he names Touchstone after a court jester to get ready and be useful to the new Abhorsen. When Sabriel returns, she tells Touchstone to call her Sabriel, and as they talk, he becomes increasingly frustrated he can’t remember anything other than trying to protect the Queen. This makes him more than 200 years old since the Old Kingdom hasn’t had a ruling monarch since then, only chaos. Using Mogget’s map, the three plan the next phase of the journey to Belisaere. It’s six weeks on foot, but Mogget suggests they take a ship. 

The next morning, the party leaves the sinkhole by a hidden stairway Touchstone remembered. It’s a narrow and steep climb leading to a large room with a set of double doors. They exit into a clearing in a pine forest called The Watchwood. They follow Charter stones through the forest like beacons to a cliff overlooking the village of Nestowe where they hope to find a boat. It looks deserted, and Sabriel can feel the dead. She makes the decision that they will go down to the village while the sun is high. 

They walk into the village, the streets are empty, but in the houses the dead hide from the daylight. It’s pretty creepy. At the end of the main street on a well-tended lawn is a broken Charter stone and the Charter Mage sacrificed to break it is still crumpled in front. This happened only three or four days ago. After Sabriel burns the body, they carry on to the harbor when they see an island with signs of inhabitants, but the bridge across to it has been destroyed. Arrows are shot at them, so Touchstone announces them, the Abhorsen and her sworn swordsman, demanding to speak to their elder. A very old man shambles out who remembers the Abhorsen from his youth and Sabriel carries some of the Abhorsen’s tools. When she flashes the sword, the Elder commands the plank be lowered on the bridge so they can cross. Good thing too as darkness is falling, thick clouds are rolling in and the dead have been watching them the whole time. Waiting. 

There are a small number of survivors of Nestowe, they are on an island but think a dead thing is there with them because something is killing them off. Sabriel walks amongst them, noticing one person wearing a big thick boat cloak despite the warmth of all the bodies and the candles in the small shed. The man isn’t dead, he has a dead parasite attached to him, a Mordant. Sabriel wants to remove the Mordant from the man, but the creature has other ideas and sucks the man of his life. As he rises, dead, Touchstone stabs him and Sabriel uses one of her bells on the Mordant to still it, and a second to send it back to Death. To make a horrible situation worse, Sabriel can sense the Mordicant in Nestowe, searching for her. She insists the Elder give them a boat for their own safety as much as hers because the Mordicant is after her and should follow her. The Elder complies. Sabriel climbs aboard the boat, Touchstone will steer and Mogget will guide them. 

They travel for six days before coming in sight of Belis Mouth, the gateway into the capital city of the Old Kingdom, Belisaere. Much of it in silence as Touchstone isn’t too chatty, but then Mogget realizes that due to the constant movement and deep water, any magics on them will have weakened, meaning all the magic keeping them from speaking aloud what they remember from two hundred years ago is not going to stop them now. Touchstone explains he was a Royal Guard, friends with the Queen’s son Rogir. Rogir went off the rails… meaning, he swapped real Life for power and came back from years of study in a Free Magic construct, his real body hidden. He killed his sisters and his mother to break the great Charter Stones and succeeded in breaking two of the six great stones. The Abhorsen of the time intervened, but was too late. The Old Kingdom descended into chaos and Rogir would soon try to come back. Sabriel realizes that Rogir is Kerrigor. Before any more answers can be gained, they reach shallower waters and the secret keeping magic is back in force. 

They head toward the busy harbor. Sabriel can feel the Dead there but they seem to be further inland, and she is concerned the people of the city have a deal with the Dead. Once moored, Touchstone pays a lad to take them to the best inn. As they make their way through the bustling streets, Sabriel sees a giant flowing aqueduct with guards posted under and around it. So this is how the living are keeping the Dead at bay, the Dead can’t get under moving water any easier than over. Once in the inn, Sabriel takes her disgustingly matted, dirty and smelly clothes off and has a bath whilst unfortunately listening to the dulcet sounds of the couple in the next room having sex and she jealousy thinks it’s Touchstone, but he’s in the bar waiting for her to finish her bath so he can use her tub. After they are clean, they plan their next steps. Sabriel believes her father’s body will be in the cave with the great Charter Stones and Mogget agrees. They’ll go on a sunny day, but the cave will have at best twilight levels of brightness so basically it will likely be filled with the Dead. Great. 

The next day, they set off for the cavern with the great Charter Stones. Mercenaries are waiting to enter the city, they need their decoys and bait before going anywhere near the Dead, meaning they are taking in small enslaved children manacaled together. Sabriel wants to stop them, but Mogget warns against setting them back further and exposing that she is the Abhorsen. Surely this won’t cause any problems later. After handing over their fee (bribe) to enter the city, Touchstone leads them on the best path and eventually they find themselves entering the cavern. It’s dark with only some light holes letting the sun in and even those darken as clouds go by. They wade through the still waters, Sabriel feeling awful at the feel of the corruption in the place. In the dark, Sabriel sees a faint light and walking closer, she sees it’s a diamond of protection and in the middle is a figure rimmed in frost and ice. It’s her father.

Sabriel and Touchstone join hands, with Mogget watching on, and with no little effort, they create their own diamond of protection. As Sabriel prepares to go into Death, Touchstone clumsily kisses her cheek, seeing Sabriel as a woman and not just the Abhorsen for the first time. Sabriel enters Death past the first gate but before reaching the second, a creature with characteristics of something from the fifth gate moves towards her. Luckily Sabriel has her sword and lops off its head. Continuing on, Sabriel hears a thunderous crash and screams, cries and shrieks of an approaching wave and needs to run to the third gate. Meanwhile, Touchstone and Mogget watch the Dead shuffle into the cavern. They don’t approach, but line the walls. In an offhand comment, Mogget says they’re like an honor guard. Kerrigor must be coming…

Sabriel was able to reach the third gate before the wave crashed and is now making her way through the fourth and is able to feel the presence of her father. After some wandering, she sees him inside the fourth gate, buried up to his head. With some winks and side eyes, Daddy Abhorsen indicates to Sabriel a Dead creature like the one that brought her the sword and bandolier. Using one of her bells, she gives the Dead a white fleshy tongue and her father is able to speak. He tells Sabriel to use two bells, typically a very dangerous combination, but the pattern and sound help bring Daddy Abhorsen out of the trap. Once free, and with urgency, they start toward Life. Daddy Abhorsen explains that Kerrigor, or rather, Rogir’s body is in Ancelstierre and Sabriel, with her knowledge of the land beyond the Wall and the assistance of beings who can see the future called The Clayr, will be able to find Rogir’s body and kill him at last. Once that is done, they can awaken the bastard Prince from his sleep as a wooden ship figurehead and…. Yeah too late, that’s been done and he’s called Touchstone now and he’s with Mogget in the cavern with their bodies. Well, since matters are moving faster than Daddy Abhorsen expected, and he only has a hundred hundred heartbeats left in Life, they’d better get a wiggle on. Meanwhile, the Dead continue to circle Touchstone and Mogget. 

The Dead are chanting and clapping in a line, marching out toward them forming a corridor. The Mordicant arrives and waits like a dog waiting for his master. It howls when Kerrigor arrives and greets his little brother, Touchstone. Meanwhile, Sabriel and Daddy Abhorsen have reached the First Gate. Daddy Abhorsen gives final instructions to Sabriel to grab Touchstone, head to the southern stairs and to the Clayrs who should have a Paperwing waiting for them to fly to the Wall. Daddy Abhorsen takes the sword and one of the bells and they plunge into Life. 

Kerrigor hasn’t yet attacked Touchstone and Mogget when Sabriel and Daddy Abhorsen come back to their physical bodies. Sabriel grabs one of Touchstone’s swords and his hand then drags him to the Southern stairs. From behind they hear Daddy Abhorsen ring the bell, the bell that calls everyone to their final Death. Sabriel and Touchstone can feel its pull, but Sabriel slaps Touchstone, feeling him slip away before pulling his face into a biting kiss. When the bell toll stops, they are exhausted. Daddy Abhorsen is dead, Kerrigor will come back, Mogget… who knows… though Sabriel still has his ring. 

Sabriel and Touchstone make it out into the sunlight. She asks her sworn swordsman about being a prince, but Touchstone denies it, saying his mother was the Queen but his father was a nobody. As they climb the exhausting path up to the palace and the garden where the Clayr should hopefully have the Paperwing, Touchstone spots the slave mercenaries from that morning who are now hunting them. One fires an arrow at Sabriel and it hits her side. Touchstone picks her up and powers the rest of the way. At the top, Touchstone puts Sabriel down in front of two of the Clayr, twin sisters Ryelle and Sanar, and the Paperwings they brought. The sisters, using magic, show Sabriel their vision of where Kerrigor’s body is in Ancelstierre. They show her what was advertised as a recent folly, only two hundred or so years old, a fake cairn, but it’s not, it’s Rogir’s hiding place. And it’s not far from Waverley College. 

At the Wall, a private reports to Colonel Horyse that there is aircraft approaching the garrison from the other side of the Wall. What?!?! Horyse comes out, grabs the binoculars from a soldier and sees Sabriel and a strange man riding what looks like a powered glider decorated like a bird. He orders a patrol to cross the Wall and find out just what the dickens is going on. On the Old Kingdom side, Sabriel and Touchstone have landed. They gather their belongings including The Book of the Dead, which now appears to be bleeding, and send the Paperwing back. The patrol takes them to Horyse where he confirms it will be the full moon that night. Time works differently over the Wall. Sabriel explains their situation requesting the Charter Mages from the company help her with the cairn and to advise anyone left at the garrison not to engage Kerrigor. She also insists that the strongest Charter Mage of the Company, who happens to be Horyse, comes too.

Sabriel and Touchstone get into Horyse’s car with the Colonel and his driver and head off to the cairn in a convoy of motorcycles, buses and tanks. They stop at the village of Bain on the way to inform the police superintendent what is happening and to sound the alarm bells hoping to prevent too much collateral damage from Kerrigor’s invasion. Whilst there they are informed that there is a thick fog rolling in from the Wall. Kerrigor is coming early and bringing the darkness with him. Communication to the Wall garrison is lost. The company proceeds to the cairn, and as they approach, Touchstone tells Sabriel he loves her and she confesses the same. As they start to dig the sarcophagus out of the cairn, rolling waves of nausea hit those around the company, and it worsens as they dig deeper. Horyse puts a call into the Bain police superintendent and finds out the fog is fast approaching. They have less than forty minutes. 

The last of the blocks are removed to reveal the sarcophagus and the waves of nausea are even stronger than before. Sabriel will touch the sarcophagus, Touchstone holding her hand, Horyse his, and so on until all fourteen Charter Mages who came with them can assist in opening it. It doesn’t work. They need more Charter Mages. An offhand comment reminds Sabriel that her old school Waverley College is only a mile away and there are thirty-five Charter Mages she can use between the 5th and 6th years and teachers. There isn’t time to bring the students to them, so with great effort, they take the Sarcophagus with them to enlist the school. It takes a little Charter magic to shut the headmistress up, more intent on being mortally offended than defending anyone’s morality, but soon the other teachers take charge to either help or keep the heck out of the way until dawn. Which is good because Sabriel has noticed the warning bell stopped a while ago, and can see the thick fog rolling up the school driveway. 

It’s only moments later that the dead reach the school. Soldiers start shooting and they start dying. Sabriel hurries inside the school and gathers the Charter Mages around the sarcophagus telling them to hold each other’s hands to create a circle of power. The power grows and flows through the Charter Mages, Sabriel directing it. With a piercing scream, the sarcophagus opens to reveal Rogir’s body, and he looks like the spitting image of Touchstone. As Sabriel starts the final rites, cries from the corridor alert her that Kerrigor is here. However it isn’t Kerrigor who interrupts the rites, it’s Mogget who has blown an entire wall of the school off. In a whirlwind of energy, Mogget isn’t in his cat form, he is squat and misshapen. He hisses about delivering his last burden before he can seek his vengeance and lays down the bell and sword Daddy Abhorsen wielded in the cavern. Kerrigor enters and gets into a small screaming fight with Mogget over who gets to kill Abhorsen. Mogget attacks Kerrigor who seems nothing more than an inky blackness of presence. Mogget is dragged into the darkness by tendrils, his white flame flashing as he fights Kerrigor devouring him. Sabriel can feel more people dying, she sees Touchstone is hurt, his leg broken from Mogget’s dramatic entrance. He begs that she flee and start a new life, but Sabriel picks up the Abhorsen sword, and reading the inscription, she says “this is not their path” as she takes up the guard position. 

Sabriel is nearly sick watching Kerrigor digest Mogget. Around her, all the dead and dying seem to have gone quiet. When Sabriel reaches for a bell, Kerrigor approaches, calling them “toys.” Suddenly one of the dying girls at her feet touches her ankle and Sabriel feels a spark of golden Charter Magic and rings the bells, forcing Kerrigor into his body in the sarcophagus. Sabriel takes her sword and thrusts it through the body of Rogir but Kerrigor only laughs and pulls the sword further into him. Meanwhile, Mogget’s ring falls into Sabriel’s hand and starts to grow. Kerrigor leans in to kiss her (yuck!!) but Sabriel turns her face, giving him her cheek. As he looms over her, Sabriel places the now huge ring over his head. At first Kerrigor laughs it off but then it starts to constrict, moving down his body, squeezing him so Sabriel can see the blackness inside, but also flashes of white. As the ring squeezes the flesh and blackness apart, Sabriel pulls one of her bells out and rings it. What is fatally wounded goes into Death, and what is alive falls into a healing sleep. 

That isn’t the end of Kerrigor though. The mound of darkness has split into two forms, one black and one white. Gradually two forms emerge as a black cat and a white cat. At first they are bound together at the neck but the ring splits into two, forming red leather collars with a little bell on each causing them to separate. Two silver rings are coughed up by them and roll toward Sabriel, lying dead on the floor, but Sabriel is not allowed to die. She is the last Abhorsen and must have an heir before she is allowed into Death. Every Abhorsen tells Sabriel to Live, they won’t let her pass the Ninth Gate yet. Sabriel’s eyes open to Touchstone begging her to live. 

The post Write up on Garth Nix’s Sabriel appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/21/write-up-on-sabriel-garth-for-nix/feed/ 0 7464
Write up on George R.R. Martin  Dying of the Light https://ddcomics.org/2026/09/11/write-up-on-george-r-r-martin-dying-of-the-light/ https://ddcomics.org/2026/09/11/write-up-on-george-r-r-martin-dying-of-the-light/#respond Fri, 11 Sep 2026 18:03:38 +0000 https://ddcomics.org/?p=7405 Background of Study George R.R. Martin was born September 20, 1948 in Bayonne, New Jersey. His father was Raymond Collins Martin, a longshoreman, and his mother was Margaret Brady Martin. He has two sisters, Darleen Martin Lapinski and Janet Martin Patten. Martin attended Mary Jane Donohoe School and Marist High School. He began writing very […]

The post Write up on George R.R. Martin  Dying of the Light appeared first on DayDreamin’ Comics.

]]>
Background of Study

George R.R. Martin was born September 20, 1948 in Bayonne, New Jersey. His father was Raymond Collins Martin, a longshoreman, and his mother was Margaret Brady Martin. He has two sisters, Darleen Martin Lapinski and Janet Martin Patten.

Martin attended Mary Jane Donohoe School and Marist High School. He began writing very young, selling monster stories to other neighborhood children for pennies, dramatic readings included. Later he became a comic book fan and collector in high school, and began to write fiction for comic fanzines (amateur fan magazines). Martin’s first professional sale was made in 1970 at age 21: “The Hero,” sold to Galaxy, published in February, 1971 issue. Other sales followed.

In 1970 Martin received a B.S. in Journalism from Northwestern University, Evanston, Illinois, graduating summa cum laude. He went on to complete a M.S. in Journalism in 1971, also from Northwestern.

As a conscientious objector, Martin did alternative service 1972-1974 with VISTA, attached to Cook County Legal Assistance Foundation. He also directed chess tournaments for the Continental Chess Association from 1973-1976, and was a Journalism instructor at Clarke College, Dubuque, Iowa, from 1976-1978. He wrote part-time throughout the 1970s while working as a VISTA Volunteer, chess director, and teacher.

In 1975 he married Gale Burnick. They divorced in 1979, with no children. Martin became a full-time writer in 1979. He was writer-in-residence at Clarke College from 1978-79.

Moving on to Hollywood, Martin signed on as a story editor for Twilight Zone at CBS Television in 1986. In 1987 Martin became an Executive Story Consultant for Beauty and the Beast at CBS. In 1988 he became a Producer for Beauty and the Beast, then in 1989 moved up to Co-Supervising Producer. He was Executive Producer for Doorways, a pilot which he wrote for Columbia Pictures Television, which was filmed during 1992-93.

Martin’s present home is Santa Fe, New Mexico.

By 1977, Martin had already published a number of stories in his Thousand Worlds setting and it made sense that his first full-length novel would also form a part of it. Originally, it was serialised in Analog Science Fiction and Fact between April and July 1977. In the SF Masterworks edition of Dying of the Light, Martin’s friend and collaborator Lisa Tuttle provides a useful introduction which explores its place in his career. She describes the novel as “an apprentice work”, and as the last gasp of the author’s youthful, romantic period. Certainly, there is a pervasive theme of endings and change in this book.

Dying of the Light opens with a lyrical description of the planet Worlorn, which for hundreds of years existed on the edges of human awareness. A rogue planet hurtling through space without a star of its own, it was a useless rock. Only when it came into the orbit of the red star “Fat Satan” and its “hellcrown” of orbiting smaller stars did Worlorn become of real interest. For ten years, it hosted a massive festival organised by representatives from fourteen human worlds. But when the novel begins, the festival is long over, the planet is leaving the stars behind, and it has become a dying world.

The main character is Dirk t’Larien, a resident of the advanced and civilised planet of Avalon. He travels to Worlorn at the behest of an old flame, ecologist Gwen Delvano. Since their time on Avalon, Gwen has become the betheyn or “heldwife” of Jaan Vikary, a member of the ritualised, backwards culture of High Kavalaar. Jaan, in turn, is bound by tradition to another man, Garse Janacek – his blood brother or teyn. These and other complex Kavalar relationships play out against the backdrop of a doomed planet.

Dying of the Light is a rather gloomy, mournful novel. It is the elegy for the planet Worlorn, for the abandoned cities built for the long-ended festival, for the love between Dirk and Gwen, and for the cruel, ossified culture of the Kavalar. All of these disintegrating elements are lit by the receding stars of the hellcrown, which shine more dimly on the planet with each passing day. The story has a fairly tight focus, revolving as it does around four characters closely bound by love, tradition, and obligation. They live a lonely life, surrounded by fourteen abandoned and mostly decaying cities.

Martin spends much of the first half of the novel outlining the unique astronomical conditions of Worlorn, the relationship between Dirk and Gwen, and the intricacies of the Kavalar culture in which women are essentially regarded as property. During this phase, Dirk solidifies his view of the situation, which is strongly challenged by the faster-paced and more engaging events of the second half. This results in a real change in the way both Dirk and the reader views the status quo on Worlorn, which is perhaps the novel’s major strength.

Dying of the Light rarely approaches the excitement and economy of Martin’s short fiction from this era. This first half, certainly, feels overly drawn out. Tuttle is right to identify the book as an “apprentice work”, but it has a uniquely elegiac feel which gives it a distinctive identity both within Martin’s bibliography and in the context of 1970s American SF.

Literature Review

Dying of the Light tells the tale of Dirk t’Larien, who is summoned to Worlorn by his former partner Gwen. Seeking closure since their separation, after which he became a nomadic wanderer among the planets, Dirk comes to Worlorn and finds that Gwen has remarried. Sort of. See, Dying of the Light is fundamentally about one of the fourteen societies to settle on Worlorn, the High Kavalars. The High Kavalars are a militaristic society with similarities to the Dothraki of the Ice and Fire novels, with duels between members routine and commonplace. Each Kavalar male takes a ‘teyn’, a male life partner who is part husband and part brother. There is certainly a pretty clear homoerotic undertone to this relationship, but it’s a bit more complicated than that. A Kavalar can also take a ‘beteyn’, a female who becomes his property. Dirk finds that his beloved Gwen has become ‘beteyn ‘ to Jaan, a moderate Kavalar who treats her as a wife rather than as a favourite slave, and seeks to preserve the spirit of brotherhood and honour of Kavalar society whilst abandoning the less respectable habit of hunting humans like animals and treating all women as property. For this he is hated. Also in the mix is Garse, Jaan’s ‘teyn’ who is much less moderate than his partner. Dirk is thrown into a complex web of love and hatred between the three in their bizarre triad, and also comes into conflict with a group of ‘old fashioned’ Kavalars who do not even believe him to be human.

Worlorn is a world without a sun, ejected from its home system by a supernova millions of years ago and now hurtling out of the Galaxy. For a few years as it passed the colossal red supergiant Fat Satan and is attendant stars Worlon became a Festival Planet, with millions flocking from the outer worlds to spend a decade partying before it passed beyond the edge of the Galaxy. Now the Festival is over, its peoples all but gone, leaving behind a few die-hards determined to stay as long as possible before the planet freezes and becomes cloaked in eternal night.

Dirk t’Larien is summoned to Worlorn by his former lover, Gwen Delvano, for a reason she will not specify. On Worlorn Dirk finds Gwen the lover and bonded partner of Jaantony Riv Wolf high-Ironjade Vikary, a visionary leader from the barbarous world of High Kavalaan, but as he learns more about the Kavalar he becomes convinced that Gwen is trapped in a life she does not want. However, as Worlon passes into the night, greater stakes are raised and Dirk finds himself caught in a desperate struggle for survival.

Dying of the Light is one of these amazing finds.  Published for the first time in 1977 (his very first novel, I believe), it’s a science fiction story set on the rogue planet Worlorn: hurtling through space in its aimless course, for the first time since its creation the planet crosses a region densely packed with suns, and gets a chance for warmth and life, however fleeting.

The 14 existing galactic civilizations declare a Festival on Worlorn, each of them building a city to showcase their culture and its accomplishments: when the story begins, the Festival is long over, the cities mostly abandoned, the planet headed once more into the cold blackness of space.

From Worlorn Dirk t’Larien receives a whisperjewel – a psi-encoded memory storage from his former lover Gwen Delvano. It’s a summons, based on an old promise made when they both had the jewels crafted for them: never reconciled with the end of the relationship, Dirk departs for the rogue planet full of hope and dreams.  Once there, though, Gwen welcomes him with puzzlement, looking distant and ill-at-ease, and soon Dirk discovers she’s bound to another man, Jaan Vikary, a highborn from the aggressive and patriarchal society of High Kavalaan.  Now convinced that the summons was Gwen’s way to forever cut the ties with Dirk, saying a final goodbye, t’Larien slowly learns that Kavalar culture requires a woman to be little more than a chattel, to be shared between her mate and his teyn, a sort of blood brother, a bond that stands as the foundation of all things Kavalar.

The “marriage” is not an easy one, complicated by Jaan’s peculiar customs and his society’s preoccupation with racial purity and mutations, therefore Dirk slowly comes to the conclusion that the whisperjewel represented a mute appeal from Gwen to save her from the unhappy liaison.  The situation becomes more problematic as we learn that other Kavalars on Worlorn practice a form of hunt whose prey are the creatures they deem inferior and non-human, which includes everyone else by their standards, so that Jaan’s attempts at stopping the bloody sport and bringing his planet to a higher galactic standard further inflame the already volatile tempers.

Soon Dirk find himself enmeshed in a political and personal struggle, complicated by his feelings for Gwen and a slowly unfolding web of discoveries that create a fascinating cultural backdrop and change his world-view, leading to a breath-stopping open ending.

The post Write up on George R.R. Martin  Dying of the Light appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2026/09/11/write-up-on-george-r-r-martin-dying-of-the-light/feed/ 0 7405