Being a long time Ruby user and Lisp dabbler, Rakudo Perl 6 meta-programming capabilities ranked high on my list of curiosities.

Meta-programming can be described as "writing code that writes code".  This includes code that can alter itself.

I was experimenting and discovered I could not add an attribute to a class at runtime:

class Foo does Metamodel::AttributeContainer {
  submethod BUILD(:$attr) {
    my $a = Attribute.new(:name($attr), :type(Str), :package(Foo));
    self.add_attribute(self, $a);
  }
}

my Foo $foo = Foo.new(:attr('bar'));
$foo.bar = 'baz';  # No such method 'bar' for invocant of type 'Foo'
say $foo.bar;


I found the attribute could be managed in a Hash and if I used return-rw inside FALLBACK I could even return a mutable l-value:

class Foo {
  has %.attrs;
  method FALLBACK(Str:D $name, *@rest) {
    return-rw %!attrs{$name};
  }
}

my $foo = Foo.new;
$foo.bar = 'baz';
say $foo.bar;


Thanks to Jonathan Worthington for the help:

https://stackoverflow.com/questions/57993203/how-to-add-a-class-attribute-dynamically

   Page Updates
RetroPie Arcade
Customize New Linux Install
Cisco CCNA Study :: Home Lab Notes
PostgreSQL Backup Script
Generate new Factorio map
   Recent Articles
Debug a Linux Kernel in QEMU
Install xfce4 on Debian
Console Blackjack in Perl
Selenium::WebDriver::Error::UnknownError
Game of Life in C++ using the SDL2
   Tags
active-record (2) android (1) apache (1) apt (1) arcade (1) awk (2) backup (1) bash (2) bashrc (1) battleship (1) bdd (1) blackjack (12) book (1) books (1) build (1) c (2) c++ (2) cacti (1) calculator (1) capybara (1) ccna (1) cisco (1) clang (1) clang++ (1) console (5) cpp (2) crm (1) crystal (1) data (1) database (1) debian (7) diff (1) elixir (1) factorio (2) fedora (1) firewall (1) freebsd (1) g++ (1) game (4) games (1) gcc (1) gem (1) git (3) github (1) gmail (1) go-lang (3) google-chrome (1) haml (1) home (1) infix (1) ipv4 (1) irssi (1) kernel (4) lab (1) latin1 (1) life (1) linux (7) lottery (1) matrix (1) meta (1) microsoft (1) moarvm (1) model (1) module (1) mongodb (1) mp3s (1) mutt (1) nautical (1) nqp (1) object (1) oidentd (1) operator (1) orm (2) pairing (1) pair-programming (1) patch (1) perl (1) pigpen (1) postgresql (3) powerball (1) programming (1) psql (1) python (2) python3 (1) qemu (1) raku (16) raspberry-pi (1) raspberrypi (1) reactjs (2) readline (1) retropie (1) reversi (1) rhel (1) ruby (1) sdl2 (4) sed (1) selenium (1) selinux (1) snmpd (1) split (1) ssh (1) stack (1) subnet (1) systemd (1) template (1) test (1) testing (3) tictactoe (1) trace (1) typescript (2) ubuntu (2) utf8 (1) virus (1) war (1) xargs (1) xfce4 (1) xvfb (1) zef (1) zsh (1)

Copyright © 2005 - 2021

GregDonald.com · Contact · EUGOR · Nautical War · CRM12

All Rights Reserved